【问题标题】:Conforming to a UITextField Delegate Using a CustomCell (subclass) textfield使用 CustomCell(子类)文本字段符合 UITextField 委托
【发布时间】:2016-10-15 21:55:16
【问题描述】:

我有一个子类CustomCell,它继承自我的父类CreateEvent。子类描述了表格视图单元格的各个单元格,它位于CreateEvent 视图控制器上。在一个特定的单元格中,我有一个文本字段,它链接到 CustomCell 文件,但是当用户输入文本字段时,我无法从该文本字段中获取值。我也无法通过外部触摸关闭键盘并按返回键,但我主要专注于从文本字段中获取文本。我熟悉在一个普通的 swift 文件上执行这些功能,但因为这是一个子类和两个 swift 文件,我不知道该怎么做。这是我的代码:

class CustomCell: UITableViewCell, UITextFieldDelegate {

@IBOutlet weak var entranceFeeTextField: UITextField!

override func awakeFromNib() {
   super.awakeFromNib()

}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
}

class CreateEventVC: UIViewController, UITableViewDelegate, UITableViewDataSource, CustomCellDelegate, UITextFieldDelegate {

override func viewDidLoad() {
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let currentCellDescriptor = getCellDescriptorForIndexPath(indexPath)
   let cell = tableView.dequeueReusableCell(withIdentifier: currentCellDescriptor["cellIdentifier"] as! String, for: indexPath) as! CustomCell

// the following code describes the array for an expandable drop down 
if currentCellDescriptor["cellIdentifier"] as! String == "idCellNormal" {
    if let primaryTitle = currentCellDescriptor["primaryTitle"] {
        cell.textLabel?.text = primaryTitle as? String
    }

    eventType = ((cellDescriptors[0] as! NSMutableArray)[0] as! NSDictionary)["primaryTitle"]! as! String
    if let secondaryTitle = currentCellDescriptor["secondaryTitle"] {
        cell.detailTextLabel?.text = secondaryTitle as? String
    }
}
else if currentCellDescriptor["cellIdentifier"] as! String == "idCellTextfield" {
    cell.textField.placeholder = currentCellDescriptor["primaryTitle"] as? String
}


else if currentCellDescriptor["cellIdentifier"] as! String == "idCellValuePicker" {
    cell.textLabel?.text = currentCellDescriptor["primaryTitle"] as? String
}

cell.delegate = self

return cell
}


func textFieldShouldEndEditing(textField:UITextField) -> Bool {
entranceFeeAmount = cell.entranceFeeTextField.text!

return true;
}

}

我的主要问题是我不确定如何设置文本字段委托,以及如何正确符合委托。

【问题讨论】:

  • 您是在情节提要/NIB 中创建单元格吗?
  • 我正在创建一个包含文本字段的 .xib 文件中使用的特定单元格
  • 您会只有一个这样的单元格,还是打算拥有多个?

标签: swift uitableview delegates textfield


【解决方案1】:

由于只有一个特定单元格包含文本字段,因此在自定义单元格的 awakeFromNib() 中,检查文本字段是否存在,然后设置文本字段的委托。

override func awakeFromNib() {
    super.awakeFromNib()

    if (self.entranceFeeTextField != nil) {
        self.entranceFeeTextField.delegate = self as UITextFieldDelegate
    }
}

您可以使用委托将文本字段中的文本传递给CreateEvent 视图控制器。

要实现委托,请在您的 CustomCell 类的顶部创建一个协议,并添加一个将字符串从 CustomCell 传输到 CreateEventVC 的方法。

protocol CustomCellDelegate {
    func getTextFieldString(string: String)
}

CustomCell 类中声明一个委托变量。

var delegate: CustomCellDelegate?

触发textFieldDidEndEditing中的协议方法:

func textFieldDidEndEditing(_ textField: UITextField) {
    delegate?.getTextFieldString(string: self.entranceFeeTextField.text!)
}

现在,让CreateEventVC 符合CustomCellDelegate 协议并在CreateEventVC 内部实现func getTextFieldString(string: String)

func getTextFieldString(string: String) {
    print(string) //do whatever you want with it 
}

tableView(_, cellForRowAt:) 中,记得设置cell.delegate = self,因为我们希望CreateEventVC 成为接收者。

【讨论】:

    【解决方案2】:

    不清楚您想要实现什么。您已将委托设置为单元格,但想要更新控制器的属性 (entranceFeeAmount)。

    有两种方法。如果您打算只有一个这样的单元格,您可以将委托设置为您的控制器,而不是单元格本身。您可以在tableView(_, cellForRowAt:) 中执行此操作。这样,控制器将听到文本字段的事件,并处理它们。

    如果您有多个这样的单元格,您将在单元格的awakeFromNib() 中设置委托。当单元格从情节提要/NIB 实例化时,它会被调用。单元将是委托,而不是控制器,因此您需要将该委托方法移动到单元本身。但是,现在每个单元格都听到了自己的文本字段,您需要通知每个单元格的控制器。这是一个复杂的话题,可以使用委托来实现,其中控制器是单元的委托。

    【讨论】:

    • 我计划在表格视图中有多个单元格,但只有一个单元格有文本字段。您提到我需要在 tableView(_, cellForRowAt:) 中设置委托。你的意思是我应该有 cell.entranceFeeTextField.delegate = self,而不是 cell.delegate = self?
    • 是的。如果只有一个带有文本字段的单元格存在,最好让控制器作为文本字段的代表。
    • 在将 cell.delegate = self 切换为 cell.entranceFeeTextField.delegate = self 后,编译时出现错误“致命错误:在展开可选值时意外发现 nil”
    • 看来entranceFeeTextField 是零。你在你的xib中连接了吗?
    • 我不完全确定你的意思。对于 .xib,我已将其连接到我的 CustomCell 类。我已经将一个 IBOutlet 从 entryFeeTextField 连接到 CustomClass。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多