Swift:在自定义UITableViewCell上设置UITextfieldDelegate

时间:2014-09-18 19:30:22

标签: ios uitableview swift delegates

我快速疯狂...... 我有一个带有自定义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
  }
}

1 个答案:

答案 0 :(得分:2)

由于您在Interface Builder中创建了文本字段,为什么不在那里连接delegate属性?只需从文本字段控制拖动到视图控制器,然后从弹出菜单中选择委托

您无法在init(coder:)中设置文本字段的委托,因为此时文本字段尚未取消归档。如果你想以编程方式设置它,请尝试在awakeFromNib中执行此操作,保证在中取消归档nib中的所有对象后,将其称为