【问题标题】:Connecting UITextField delegate to File's Owner of Custom Table view cell not working Swift 3将 UITextField 委托连接到自定义表格视图单元的文件所有者不起作用 Swift 3
【发布时间】:2018-04-03 23:43:42
【问题描述】:

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

extension MyViewController: UITextFieldDelegate {

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

}

上面的方法没有被调用。

如果我在cellForRowAtindexPath 中添加以下代码,它会起作用:

cell.myTextField.delegate = self

谁能帮助我,为什么将UITextField 委托连接到自定义单元格中的文件所有者不起作用。

编辑

我是这样注册笔尖的:

myTableView.register(UINib(nibName: "MyCustomTableViewCell", bundle: nil), forCellReuseIdentifier: "mycustomcellreuseidentifier")

cellForRowAtindexPath:

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

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

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

尝试以下代码:

let myCustomCellNib = UINib(nibName: "MyCustomTableViewCell", bundle: nil)
myCustomCellNib.instantiate(withOwner: self, options: nil)

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

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

还是不行。

我应该去:

cell.myTextField.delegate = self

cellForRowAtindexPath.

【问题讨论】:

  • 执行此操作后,您是否在文本字段委托属性上创建了与文件所有者的连接?
  • 是的,我也这样做了。
  • 按 command+S 保存 nib 文件,然后尝试 agian。
  • @PuneetSharma - 做到了。事实上,我也尝试过退出 xcode。
  • 我上面已经提到了。

标签: ios swift uitableview uitextfield


【解决方案1】:

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

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

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

关于FileOwner,这是来自苹果的文档:

File 的 Owner 对象是一个占位符对象,在 nib 文件已加载。相反,您在代码中创建此对象 并将其传递给 nib 加载代码。

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

这可以在 nib 对象上使用 [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 第一次尝试使单元格出列但没有找到时,它会从已注册的 nib 中创建单元格,但将其所有者设置为 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: 中写这么多,最好像在注释代码中那样设置委托本身。

【讨论】:

  • 我理解前三行,但我不明白最后两行。我已经编辑了我的问题。请检查一下。
  • @Amit:编辑了答案。希望它能消除您的疑虑。
  • 非常感谢您的帮助。我尝试了您的建议,但仍然无法正常工作。
  • 我已经将项目上传到 git - github.com/meet0226/SampleTextField .
  • 非常感谢您的努力、帮助和时间。我接受你的回答,但我会在cellForRowAtIndexPath中设置代表。
【解决方案2】:

cell.myTextField.delegate = self 中,self 是您的UIViewController,它与委托MyViewController: UITextFieldDelegate 连接。 如果您已在单元格 xib 中建立连接,则您的参考是单元格。因此,如果您希望您的连接在那里工作,您必须设置与单元格MyCell: UITextFieldDelegate 的连接。

编辑: 如果你想在你的 ViewController 中使用你的委托,你必须以这种方式遵循 Puneet 的回答:

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

【讨论】:

  • 感谢您的回答。我希望我的连接在 MyViewController 而不是 MyCell 中工作。
  • 不客气,我已经编辑了我的答案,你可以检查一下。
  • 非常感谢您的帮助。我尝试了您的建议,但仍然无法正常工作。我已经编辑了问题。
  • 对不起,我从来没有使用过这种方法!我的错误,我再次编辑了我的答案;)
  • 我认为这段代码不合适,因为 myTableView.register 方法不能用自定义单元格类型的参数列表调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多