使用CustomCell(子类)文本字段符合UITextField委托

时间:2016-10-15 21:55:17

标签: swift uitableview delegates textfield

我有一个子类CustomCell,它继承自我的父类CreateEvent。子类描述了表视图单元的各个单元格,它位于CreateEvent View控制器上。在一个特定的单元格中,我有一个文本字段,它链接到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;
}

}

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

2 个答案:

答案 0 :(得分:2)

由于只有一个特定单元格包含文本字段,因此请在自定义单元格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协议并在func getTextFieldString(string: String)内实施CreateEventVC

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

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

答案 1 :(得分:0)

不清楚你想要达到的目标。您已将委托设置为单元格,但希望更新控制器的属性(entranceFeeAmount)。

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

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