我创建了一个具有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
在身份检查器中进行了以下更改:还是行不通。
我应该去:
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/