2015-12-23 69 views
0

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

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

回答

1

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

如果我是正确的,你可以使用一个静态的tableView(当你有几个文本框)

希望这可以帮助。

+0

我同意。使用静态单元的配置文件屏幕效率更高,因此我接受您的答案。但是我可以从原型切换到静态单元而没有任何问题。情况并非总是如此。我不得不使用静态单元创建另一个视图控制器来处理其他对象的文本输入。有人可能想要在一个视图控制器中处理所有对象的文本输入。在这种情况下,静态单元不是一种选择,因为您必须为不同的对象显示不同的文本字段。 – rmxmaster

0

在你做这行“nameTextField = cell.viewWithTag:(1)”之前,在viewDidLoad中尝试运行类似self.tableView.reloadData的东西。

+0

试过了。在'viewDidLoad'中(也在'viewWillAppear'中)'tableView.reloadData()'之后,'nameTextField'仍然是'nil',所以下一行的任何东西'print(nameTextField)'都会导致崩溃。 – rmxmaster

1

我不确定我完全理解您想要做什么,但单元格通常在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() 
     } 
    } 
} 

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

+0

那么,我的'cellForRowAtIndexPath'方法几乎完全按照您的建议书写,但那不是我的问题。我有四个单元格中的四个文本字段。我可以使用同一个'cellForRowAtIndexPath'中的数据填充它们,但这样做效率不高。另外,在调用'viewDidAppear'之前,我不能调用'nameTextField.becomeFirstResponder',因为直到'nameTextField'为'nil'。 – rmxmaster

+0

我已经编辑了我的答案,包括一些使单元成为第一响应者的逻辑。单元的'awakeFromNib'方法在所有的子视图初始化后都会被调用,所以没有获得'nil'文本框的风险。我不知道为什么用'cellForRowAtIndexPath'方法填充数据的单元效率不高。在这种情况下,如果您有大量数据,可能会感兴趣的是查看MVVM模式。这意味着您只需将一个数据对象传递给单元格,然后使用它在自己的'awakeFromNib'方法中配置单元格。 – mschumacher