- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个包含表单的应用程序。我所做的是使用 UITableView
制作包含某些部分的表单。每个单元格都有一个 UITextField
来获取用户的输入。因为我使用的是 RxSwift
,所以我将单元格内的每个文本字段绑定(bind)到一个 BehaviorRelay
到我的 ViewModel 类。不幸的是,每当用户向每个单元格输入内容时,它都会有一个非常奇怪的行为。例如(如下所示)每次用户在第一个单元格输入一些值,用户向下滚动后, TableView 中的最后一个单元格具有相同的值(注意用户尚未滚动页面,因此没有向最后一个单元格输入任何值)。第二个例子是当我在最后 3 个单元格中输入一些值时,前 3 个单元格的值也发生了变化。
以下是我设法实现这一目标的方法:
我的自定义单元格类:
class FormTableViewCell: UITableViewCell {
@IBOutlet weak var titleLbl: UILabel!
@IBOutlet weak var valueTf: UITextField!
override func awakeFromNib() {
super.awakeFromNib()
}
func configureCell(title: String, placeholder: String, keyboardType: UIKeyboardType? = .default) {
titleLbl.text = title
valueTf.placeholder = placeholder
valueTf.keyboardType = keyboardType ?? .default
}
func getValueAsDriver() -> Driver<String> {
valueTf.rx.text.orEmpty.asDriver()
}
}
我如何在我的 UIViewController
类中配置 tableView(_:cellForRowAt:)
函数中的每个单元格(我的应用程序中总共有大约 15 个单元格):
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let formCell = tableView.dequeueReusableCell(withIdentifier: Config.FORM_TABLEVIEWCELL_ID) as! FormTableViewCell
if indexPath.section == 1 {
if indexPath.row == 0 {
formCell.configureCell(title: "Some title", placeholder: "Some placeholder", keyboardType: .decimalPad)
viewModel.bindValue(from: formCell.getValueAsDriver())
return formCell
} else if indexPath.row == 1 {
// Do pretty much the same thing as before
}
} else if indexPath.section == 2 {
// Do pretty much the same thing as before
} ...
return UITableViewCell()
}
我如何在我的 ViewModel 类中绑定(bind)文本字段值:
final class ViewModel {
private let _someValue = BehaviorRelay<String>(value: "")
func bindValue(from driver: Driver<String>) {
driver.distinctUntilChanged().drive(onNext: { [unowned self] value in
_someValue.accept(value)
}).disposed(by: disposeBag)
}
}
我的问题是,当用户滚动表格 View 时,如何将每个文本字段的值保留在单元格内?另外,如果您有更好的方法,请告诉我。谢谢。
最佳答案
您可以通过将文本字段绑定(bind)到行为中继并使用 take(1)
来保留每个文本字段的值。像这样的东西:
viewModel._someValue
.take(1)
.bind(to: valueTf.rx.text)
.disposed(by: cellDisposeBag)
注意上面你的手机需要一个处理袋。在该单元格中,您还必须释放 disposeBag 并在 prepareForReuse
方法中创建一个新的。
override func prepareForReuse() {
super.prepareForReuse()
disposeBag = DisposeBag()
}
一些其他的一般注意事项...如果您觉得有必要在您的 View 模型中放置一个 disposeBag,那么您可能做错了什么。您的 View 模型不应该是一个类。它应该是一个结构或更好的单一函数。
更好的方法是使用 RxDataSources 库并摆脱 View Controller 中巨大的“if/else if”链。我会更像这样写:
final class ExampleViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
let viewModel = ViewModel()
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
let dataSource = RxTableViewSectionedReloadDataSource<FormSectionModel>(
configureCell: { [formValues = viewModel.formValues] _, tableView, _, item in
let formCell = tableView.dequeueReusableCell(withIdentifier: Config.FORM_TABLEVIEWCELL_ID) as! FormTableViewCell
formCell.configureCell(item: item, formValues: formValues)
return formCell
},
titleForHeaderInSection: { dataSource, index in
dataSource.sectionModels[index].model
}
)
Observable.just(viewModel.form)
.bind(to: tableView.rx.items(dataSource: dataSource))
.disposed(by: disposeBag)
}
}
final class FormTableViewCell: UITableViewCell {
@IBOutlet weak var titleLbl: UILabel!
@IBOutlet weak var valueTf: UITextField!
var disposeBag = DisposeBag()
override func prepareForReuse() {
super.prepareForReuse()
disposeBag = DisposeBag()
}
func configureCell(item: FormItem, formValues: BehaviorSubject<[FormID : String]>) {
titleLbl.text = item.title
valueTf.placeholder = item.placeholder
valueTf.keyboardType = item.keyboardType
formValues
.map { $0[item.formID] }
.take(1)
.bind(to: valueTf.rx.text)
.disposed(by: disposeBag)
valueTf.rx.text
.withLatestFrom(formValues) { entry, values in
with(values) {
$0[item.formID] = entry ?? ""
}
}
.bind(to: formValues)
.disposed(by: disposeBag)
}
}
struct ViewModel {
let form: [FormSectionModel] = [
FormSectionModel(model: "PELANGGAN", items: [
FormItem(formID: .pelanggan, title: "Pelanggan", placeholder: "")
]),
FormSectionModel(model: "PUNGGUNG", items: [
FormItem(formID: .pangangPunggung, title: "Pangang Punggung", placeholder: "eg 20", keyboardType: .numberPad),
FormItem(formID: .tinggiPunggung, title: "Tinggi Punggung", placeholder: "eg 20", keyboardType: .numberPad)
]),
FormSectionModel(model: "PUNDAK", items: [
FormItem(formID: .jarakPundak, title: "Jarak Pundak", placeholder: "eg 20", keyboardType: .numberPad),
FormItem(formID: .lebarPundak, title: "Lebar Pundak", placeholder: "eg 20", keyboardType: .numberPad),
FormItem(formID: .tinggiPundak, title: "Tinggi Pundak", placeholder: "eg 20", keyboardType: .numberPad),
])
]
let formValues = BehaviorSubject<[FormID: String]>(value: [:])
}
typealias FormSectionModel = SectionModel<String, FormItem>
struct FormItem {
let formID: FormID
let title: String
let placeholder: String
let keyboardType: UIKeyboardType
}
extension FormItem {
init(formID: FormID, title: String, placeholder: String) {
self.formID = formID
self.title = title
self.placeholder = placeholder
self.keyboardType = .default
}
}
enum FormID {
case pelanggan
case pangangPunggung
case tinggiPunggung
case jarakPundak
case lebarPundak
case tinggiPundak
}
func with<T>(_ item: T, _ fn: (inout T) -> Void) -> T {
var item = item
fn(&item)
return item
}
关于ios - 使用 RxSwift 时如何在 UITableViewCell 中保留 UITextField 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68139983/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!