我快速疯狂...... 我有一个带有自定义UITableViewCell的UITableViewController。 UITableView单元格包含一个UITextfield,它通过Interface Builder连接。
虽然我可以在不设置委托的情况下编辑UITextfield,但我无法使键盘消失。当我尝试设置UITextField的委托时,App崩溃了。
致命错误:在解包可选值时意外发现nil
由于我通过IB设置TextFiled,我不必使用UITextField()创建它,是吗?我错过了什么?
MainTableViewController:
import UIKit
class MainTableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// Return the number of sections.
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// Return the number of rows in the section.
return 5
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CounterCell", forIndexPath: indexPath) as CounterTableViewCell
// Configure the cell...
return cell
}
}
自定义TableViewCell:
import UIKit
class CounterTableViewCell: UITableViewCell, UITextFieldDelegate {
// ==================================================
// MARK: - Variables
// ==================================================
// MARK: - Outlets & Actions
@IBOutlet weak var tfName: UITextField!
// ==================================================
// MARK: - Lifecycle
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
NSLog("init coder")
// ERROR HERE: fatal error: unexpectedly found nil while unwrapping an Optional value
tfName.delegate = self
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
// ==================================================
// MARK: - UITableViewCell methods
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
// MARK: - UITextFieldDelegate
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
return true;
}
func textFieldDidEndEditing(textField: UITextField) {
// do nothing yet
}
}
答案 0 :(得分:2)
由于您在Interface Builder中创建了文本字段,为什么不在那里连接delegate
属性?只需从文本字段控制拖动到视图控制器,然后从弹出菜单中选择委托。
您无法在init(coder:)
中设置文本字段的委托,因为此时文本字段尚未取消归档。如果你想以编程方式设置它,请尝试在awakeFromNib
中执行此操作,保证在中取消归档nib中的所有对象后,将其称为。