我创建了一个具有UITableView和自定义单元格和xib的视图控制器。在自定义单元格xib中添加了UITextField。现在,我已将UITexField的代表连接到自定义单元格xib的文件所有者,并在View控制器中添加了以下代码:

extension MyViewController: UITextFieldDelegate {

  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
      textField.endEditing(true)
      return true
  }

}

上面的方法没有被调用。

如果我在cellForRowAtindexPath中添加以下代码,它将起作用:
cell.myTextField.delegate = self

有人可以帮我吗,为什么在自定义单元格中将UITextField委托连接到File的所有者不起作用。

编辑

我正在这样注册笔尖:
myTableView.register(UINib(nibName: "MyCustomTableViewCell", bundle: nil), forCellReuseIdentifier: "mycustomcellreuseidentifier")

并在cellForRowAtindexPath中:
let cell = tableView.dequeueReusableCell(withIdentifier: "mycustomcellreuseidentifier", for: indexPath) as! MyCustomTableViewCell

除了MyCustomTableViewCell@IBOutlet,我没有在UITextField中添加任何代码。

编辑-在@Puneet Sharma和@Francesco Deliro的帮助下

尝试以下代码:
let myCustomCellNib = UINib(nibName: "MyCustomTableViewCell", bundle: nil)
myCustomCellNib.instantiate(withOwner: self, options: nil)

myTableView.register(myCustomCellNib, forCellReuseIdentifier: "mycustomcellreuseidentifier")

就像@Puneet Sharma建议在笔尖中更改文件的所有者。我通过将类名称添加到MyViewController在身份检查器中进行了以下更改:

ios - 将UITextField委托(delegate)连接到自定义表 View 单元的文件所有者不起作用Swift 3-LMLPHP

还是行不通。

我应该去:
cell.myTextField.delegate = self

cellForRowAtindexPath中。

最佳答案

您从未将笔尖的所有者设置为MyViewController。

您必须在提供registerNib:forCellReuseIdentifier:对象的MyViewController类中调用UINib

您必须通过调用UINib创建了这个init(nibName:bundle:)对象。在那里,您尚未提供此笔尖的所有者作为MyViewController

关于FileOwner,这来自Apple的文档:

文件的所有者对象是一个占位符对象,在创建时不会创建
笔尖文件已加载。相反,您可以在代码中创建此对象
并将其传递给笔尖加载代码。

对于UIViewController nib / storyboard,XCode模板已经设置了FileOwner,因此您可以直接建立IBOutlet连接。
如果是自定义tableviewCell,则需要通过代码提供文件所有者。

可以在笔尖对象上使用[instantiate(withOwner:options:)] [2]方法来完成此操作(我无耻地复制了上面Fransesco的回答中的代码)。

let nib = UINib(nibName: "MyCustomTableViewCell", bundle: nil)
nib.instantiate(withOwner: self, options: nil)
myTableView.register(nib, forCellReuseIdentifier: "mycustomcellreuseidentifier")


之前,我认为可以使用instantiate(withOwner:)方法的UINib方法设置文件所有者,但是尽管此方法用于设置nib所有者,但在tableview.register(nib:)方法的情况下不起作用。

这可能是因为,当tableview第一次尝试使单元出队并且没有找到它时,它从已注册的笔尖创建了单元,但是将其所有者设置为nil。我还没有找到官方的文档来支持这一点,但是这可能正在发生,导致示例项目出现问题。

我已经从示例中删除了registerNib代码,并在cellForRowAtIndexPath:中创建了单元格,并且可以正常工作。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "mycellreuseidentifier") as? MyTableViewCell
    if cell == nil {
        let array = Bundle.main.loadNibNamed("MyTableViewCell", owner: self, options: nil)
        cell = array!.first as! MyTableViewCell
    }
    return cell!
}

仅仅这还不够。您必须将nib内的文件所有者更改为MyViewController。这将在笔尖的“身份检查器”选项卡中完成。只需将MyViewController设置为FileOwner。

尽管这可行,但是我想如果您需要在cellForRowAtIndexPath:中编写太多代码,最好像在注释代码中所做的那样自行在其中设置委托。

关于ios - 将UITextField委托(delegate)连接到自定义表 View 单元的文件所有者不起作用Swift 3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46889140/

10-12 15:57