Swift 检测 .xib 文件中文本字段的变化

Posted

技术标签:

【中文标题】Swift 检测 .xib 文件中文本字段的变化【英文标题】:Swift Detecting a Change in a Textfield from a .xib file 【发布时间】:2017-04-17 02:24:00 【问题描述】:

我的问题是我在可扩展表格视图中有一个文本字段,它由 cellDescription plist 决定。在这个表格视图中,当地址部分展开时,会弹出一个文本字段,用户可以在其中输入地址。用户必须在键盘上按回车键(或回车键)才能保存地址。我想知道是否有一种方法可以检测文本字段的变化,可以不断更新文本字段的值,这样用户就不必输入回车来保存地址。下面是我的代码当前的结构,但我很困惑,因为文本字段不在常规视图控制器内,而是在外部 xib 文件中。

func configureTableView() 
    tblExpandable.delegate = self
    tblExpandable.dataSource = self
    tblExpandable.tableFooterView = UIView(frame: CGRect.zero)
    tblExpandable.register(UINib(nibName: "TextfieldCell", bundle: nil), forCellReuseIdentifier: "idCellTextfield")



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


    if currentCellDescriptor["cellIdentifier"] as! String == "idCellTextfield" 
        cell.textField.placeholder = currentCellDescriptor["primaryTitle"] as? String
        valueOfInterest = cell.textField.text!

    


    cell.delegate = self

    return cell


func textfieldTextWasChanged(_ newText: String, parentCell: CustomCell) 
    let parentCellIndexPath = tblExpandable.indexPath(for: parentCell)

    var address = ""

    address = "\(newText)"


    ((cellDescriptors[0] as! NSMutableArray)[11] as AnyObject).setValue(address, forKey: "primaryTitle")
    location = (((cellDescriptors[0]) as! NSMutableArray)[11] as! NSDictionary)["primaryTitle"]! as! String
    tblExpandable.reloadData()

【问题讨论】:

【参考方案1】:

在这里,您的 CustomCell 中有文本字段。所以在CustomCell类中设置文本字段的outlet为:

    @IBOutlet weak var textField:UITextField!

然后将CustomCell类设置为textField的delegate,实现textField所需的delegate方法,检测textField值的变化。

【讨论】:

如何将 CustomCell 类设置为 textField 的委托,因为这个 swift 文件没有“覆盖 func viewDidLoad() ”? 为什么需要 viewDidLoad() 方法来设置委托。您可以从 xib 文件或自定义单元类的 awakeFromNib() 方法中设置委托。 尝试在 awakeFromNib() 中设置委托,如:“textField.delegate = self”在模拟器中运行时会导致错误:致命错误:在展开可选值时意外发现 nil。我没有正确设置委托吗? 这可能是因为 textField 尚未自行初始化。请在视图完全加载后设置您的委托。您可以在这里尝试其他选项。尝试在 Xib 文件中设置委托,希望这能解决您的问题。

以上是关于Swift 检测 .xib 文件中文本字段的变化的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 检测文本字段中的变化

检测文本字段中的位置和变化

Swift,iOS - 单击以显示文本字段时按钮向上移动?然后搬回去?

从 Textfield.inputview 加载 xib UIView

iOS 自定义 .xib 视图按钮点击检测在视图控制器 (Swift)

Swift 包中的 XIB 文件 - 忽略约束