gpt4 book ai didi

ios - 需要有关如何对动态构建的 TableView 执行验证的建议

转载 作者:行者123 更新时间:2023-11-29 11:46:09 24 4
gpt4 key购买 nike

我正在开发一个应用程序,该应用程序将包含 13 个可以填写并发送到 Web 服务的表单。所有这些表单都包含多个字段,尽管其中多个字段包含在多个表单中。

当然,我本可以采用简单地创建 13 个 View Controller 的方法。表单在不久的将来不会改变,因此静态单元格可以解决问题,但在代码和 Storyboard 中创建 13 个 View Controller 似乎并不优雅。

所以我决定创建一个包含各种动态原型(prototype)单元格的 View Controller ,然后可以在需要时由不同类型的表单使用。

我创建了一个简单的模型,并使用选定的 FormType 来查看该表单中需要哪些字段(表格 View 单元格)。

struct Form {
let type: FormType
let identifier: String
let cellTypes: [CellType]
let requiredFieldsIndexes: [Int]

enum FormType: String {
case permissionEndPoint = "FAP-11"
case other2 = "2"
// etc...

然后我在代码中创建了 13 个表单:

Form(类型:.permissionEndPoint,标识符:“SAP.01”,cellTypes:Array([.kilometerConstraints,.additionalInformation,.permissionNumber]),requiredFieldsIndexes:[0])

并使用 tableview 委托(delegate)方法显示正确的字段。` func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 返回 displayedForm.cellTypes.count

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let identifier = displayedForm.cellTypes[indexPath.row]

switch identifier {
case .trafficControlCenter:
return tableView.dequeueReusableCell(withIdentifier: identifier.rawValue, for: indexPath)
case .trainInformation:
return tableView.dequeueReusableCell(withIdentifier: identifier.rawValue, for: indexPath)
case .permissionAtLocation:
return tableView.dequeueReusableCell(withIdentifier: identifier.rawValue, for: indexPath)
case .notUsed:
let cell = tableView.dequeueReusableCell(withIdentifier: identifier.rawValue, for: indexPath) as! NotUsedTableViewCell
return cell
case .additionalInformation:
let cell = tableView.dequeueReusableCell(withIdentifier: identifier.rawValue, for: indexPath) as! AdditionalInformationCell
cell.additionalInfoTextView.delegate = self
return cell
default:
return tableView.dequeueReusableCell(withIdentifier: identifier.rawValue, for: indexPath)
}
}`

这很好用,但我需要检查某些字段是否已填写,收集数据,并将数据以某种格式发送到网络。既然我不知 Prop 体显示了哪些字段,我应该如何访问不同的字段?或许我可以创建对所有相关 IBOutlet(文本字段、 TextView 和日期选择器)的引用来检查这些?

我的一般设置是否正确,或者是否有更简单的方法来模拟此问题?

非常感谢任何帮助。

最佳答案

您的解决方案中有不同的移动部分,重要的是将不同类之间的关注点分开。

按照 MVC 模式,我会这样做:

  • 为每个单元格创建一个 UITableViewCell 的子类,它具有单元格中控件(文本字段、 slider 、开关等)的所有必要导出。
  • 单元格还应该是这些控件的委托(delegate)(例如,UITextFieldDelegate)或控件操作的接收器,如 UISwitch,以检测用户何时更改表单中的值。
  • 当值发生变化时,单元会将此类更改传达给它自己的自定义委托(delegate)。您可以通过您的单元格子类的自定义协议(protocol)来实现它。委托(delegate)必须存储单元格数据。这是因为在表格 View 中,当单元格离开屏幕时,它可能会被重用而不保持其状态。因此,单元格需要将其传达给外部对象,否则您将丢失用户输入。
  • TableView 中所有单元格的委托(delegate)应该是数据源(可能是您的 View Controller ,或一个单独的对象)。数据源可以将自己设置为上面显示的 tableView(_:cellForRowAt:) 方法中每个单元格的委托(delegate)。
  • 每当一个单元格报告其数据发生变化时,数据源就会将此类数据存储在一个数组中。您可以询问单元格到 TableView 的索引路径,这样您就知道在数组中的哪个索引处存储此类数据
  • 每次调用 tableView(_:cellForRowAt:) 方法使单元格出列时,您都会用存储在数据源中的数据重新填充单元格。正如我所说,单元格可以重复使用,因此您可以获得一个包含其他数据的重复使用的单元格,或者一个新出列的空单元格。这就是为什么您需要将数据传回给它的原因。否则,用户在上下滚动时会在表单中看到奇怪的值。
  • 当你需要提交整个表单的数据时,你会发现它已经存储在数据源中的数组中。

关于ios - 需要有关如何对动态构建的 TableView 执行验证的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43767209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com