需要引用自定义UITableViewCell里面的UITextField委托方法在Swift中不使用标签属性

问题描述:

我在我的UITableView中有一个包含多个UITextFields的自定义UITableViewCell。包含我的tableView的我的ViewController实现了UITextFieldDelegate。这意味着当用户与textFields交互时,触发UITextField委托方法。需要引用自定义UITableViewCell里面的UITextField委托方法在Swift中不使用标签属性

我的问题是,我需要从UITextField委托方法内访问自定义UITableViewCell内包含的textFields。挑战是:不幸的是,我无法使用UITextField所具有的“标签”属性。 “标签”属性被用于其他事情,并且在这个项目中,我不幸的是无法重构它。

例如,在下面的委托方法:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 

    //instead of: if textField.tag == someNumber 
    //I would like to have something like: 
    //if textField == cell.textFieldA { 
    //... 
    //} else if textField == cell.textFieldB { 
    //... 
    //} 
... 
} 

没有人有任何意见或建议?

+0

我建议你的单元格子类应实现文本字段委托并通过另一个委托协议将相关事件传回给你的视图控制器 – Paulw11

+0

这发生在我身上(即让我的单元格子类实现UITextFieldDelegate),但我不确定如何将单元格子类的事件与包含UITableView的UIViewController链接起来。 – syedfa

+1

让视图控制器实现您的新协议(您定义的),并将其自身设置为cellForRowAtIndexPath中的单元委托。 – Paulw11

您可以创建UITextField的扩展。是这样的:

extension UITextField { 

    private struct AssociatedKeys { 

    static var someId = "someId" 

    } 

    @IBInspectable var someId: String? { 

    get { 

     return objc_getAssociatedObject(self, &AssociatedKeys.someId) as? String 

    } 

    set { 

     if let newValue = newValue { 

     objc_setAssociatedObject(self, &AssociatedKeys.someId, newValue as NSString?, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 

     } 

    } 

    } 

} 

然后你就可以访问和比较:

textField.someId 
+0

非常感谢您的及时答复。你能否详细说明你的解决方案,以及你在做什么? – syedfa

+0

我想我明白了。你正在做的是将另一个属性附加到UITextField,它的功能与“tag”属性的功能相同,对吗? – syedfa

+1

是的。你只需要调整你需要使用的变量的类型。 –

你可以试试下面的代码。我已经尝试过目标C

NSIndexPath *indexPath = [self.tableview indexPathForRowAtPoint:textField.superview.superview.center]; 

CustomTableViewCell *cell = [self.tableview cellForRowAtIndexPath:indexPath]; 
//cell.txt1 is your textfield Object 
if(textField == cell.txt1) 
{ 

} 

你可以在swift中进行转换。