【问题标题】:Populating text field in prototype cell在原型单元格中填充文本字段
【发布时间】:2015-12-23 18:29:29
【问题描述】:

目前,我在 Storyboard 中创建了一些自定义单元格的原型,其中嵌入了文本字段。要访问这些文本字段,我在cellForRowAtIndexPath: 中使用nameTextField = cell.viewWithTag:(1)。但是viewDidLoad:viewWillAppear: 方法在cellForRowAtIndexPath 之前被调用,所以当时nameTextFieldnil。为了在屏幕上显示表格视图时填充文本字段,我使用viewDidAppear:,但这会导致明显的延迟。此外,当我上下滚动表格视图时,cellForRowAtIndexPath: 会一次又一次地被调用,重置文本字段中已经输入的数据。

是否有更有效的方法可以在视图显示之前用数据填充嵌入在自定义单元格原型中的文本字段,并防止在每个 cellForRowAtIndexPath: 调用中重置输入的数据?

【问题讨论】:

    标签: ios swift uitableview uitextfield


    【解决方案1】:

    我猜您正在创建配置文件屏幕(或具有许多 textField 以从用户获取输入数据的东西)。我对吗?

    如果我是对的,你可以使用静态 tableView(当你有几个 textFields 时)

    希望这会有所帮助。

    【讨论】:

    • 我同意。带有静态单元格的配置文件屏幕更有效,所以我接受你的回答。但我可以毫无问题地从原型切换到静态单元。情况并非总是如此。我必须创建另一个带有静态单元格的视图控制器来处理其他对象的文本输入。有人可能想在一个视图控制器中处理所有对象的所有文本输入。在这种情况下,静态单元格不是一种选择,因为您必须为不同的对象显示不同的文本字段。
    【解决方案2】:

    我不确定我是否完全理解您要执行的操作,但单元格通常在 cellForRowAtIndexPath: 方法中配置,而不是在 viewDidLoad 中。您还可以尝试将文本字段连接到自定义单元类上的插座。然后你可以这样做:

    // in view controller 
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
                as! CustomCell
    
            let object = myDataSource[indexPath.row]
            cell.textField.text = object.description
            cell.shouldBecomeFirstResponder = indexPath.row == 0
            return cell
        }
    
    // then in the cell 
        class CustomCell: UITableViewCell {
        @IBOutlet weak var textField: UITextField!
        var shouldBecomeFirstResponder: Bool = false
    
        override func awakeFromNib() {
            if shouldBecomeFirstResponder {
                textField.becomeFirstResponder()
            }
        }
    }
    

    然后,当用户在文本字段中输入文本时,更新您的数据源是有意义的。

    【讨论】:

    • 好吧,我的cellForRowAtIndexPath 方法几乎完全按照您的建议编写,但这不是我的问题。我在四个单元格中有四个文本字段。我可以用相同的cellForRowAtIndexPath 中的数据填充它们,但这并不高效。我也不能在调用viewDidAppear 之前调用nameTextField.becomeFirstResponder,因为直到nameTextFieldnil
    • 我已经编辑了我的答案以包含一些使单元格成为第一响应者的逻辑。单元格的awakeFromNib 方法将在其所有子视图都已初始化后被调用,因此没有获得nil 文本字段的风险。我不确定为什么在 cellForRowAtIndexPath 方法中用数据填充单元格效率不高。在这种情况下,如果您有大量数据,查看 MVVM 模式可能会很有趣。这意味着您只需将一个数据对象传递给单元格,并使用它在其自己的 awakeFromNib 方法中配置单元格。
    【解决方案3】:

    在 viewDidLoad 中,在执行“nameTextField = cell.viewWithTag:(1)”这一行之前尝试运行类似 self.tableView.reloadData 的内容。

    【讨论】:

    • 试过了。在viewDidLoad(以及viewWillAppear)中的tableView.reloadData() 之后,nameTextField 仍然是nil,因此下一行中的print(nameTextField) 之类的内容会导致崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多