两个类相互引用/从它的委托方法中的 UITextField 访问 UITableViewCell?

Posted

技术标签:

【中文标题】两个类相互引用/从它的委托方法中的 UITextField 访问 UITableViewCell?【英文标题】:Two classes reference each other / access UITableViewCell from UITextField inside it's delegate methods? 【发布时间】:2013-08-09 13:36:40 【问题描述】:

我有一个自定义 UITableViewCell 和一个自定义 UITextField,文本字段位于表格视图单元格内。

我需要对字段中输入的文本进行一些验证,并根据输入的文本是否正常在单元格中显示一个小勾号或十字形图像。

我的表格视图单元格类导入文本字段的标题,并声明我可以使用的 .textField 属性。

我的文本字段类有我的表格视图单元格的类扩展 (@class),并声明了一个 .cell 属性,我希望能够使用它来访问单元格的图像,并显示/更新它对勾或十字。

文本字段的委托是我的视图控制器,我使用textFieldDidEndEditing 以下列方式尝试设置该图像 (validationConfirmation)。但是,它不起作用,什么都没有发生,没有错误等。

知道我做错了什么吗?这是一个谜题。

- (void)textFieldDidEndEditing:(UITextField *)textField 

    SignUpTextField *tf = (SignUpTextField *)textField;

    if (textField.text.length < 6) 
        tf.cell.validationConfirmation.hidden = NO;
        tf.cell.validationConfirmation.image = [UIImage imageNamed:@"cross.png"];
    

所以在这里,我获取文本字段子类(SignUpTextField,或者我正在尝试),并尝试设置其单元格属性的图像属性。这是错的吗?乱?不好的做法?

【问题讨论】:

【参考方案1】:

您不需要(也不应该)在 textField 类中包含单元格引用。我相信您的 textField 已添加为单元格的子视图。因此,在textFieldDidEndEditing: 方法中,您可以使用textField.superview 获取单元格。或者,您可以为与它出现的 tableview 行对应的 textField 分配一个标签,并使用 tableview 的cellForRowAtIndexPath: 方法访问单元格,您可以使用该标签来创建索引路径。

【讨论】:

那么我如何让superView 属性知道它具有validationConfirmation 属性?它不知道它是一个单元格,更不用说自定义单元格了,它认为它是UIView,不是吗? 随便投吧 (MyCellClass*)textField.superview; 也可以在转换前检查superview类型 if([textField.superview isKindOfClass:[MyCellClass class]]) MyCellClass * cell = (MyCellClass*)textField.superview; 如果我使用强制转换,我会得到一个未捕获的异常[UITableViewCellContentView validationConfirmation] 在这种情况下,您的 textField 将添加到单元格的 contentView 而不是单元格。您必须使用 textField.superview.superview 获取单元格。

以上是关于两个类相互引用/从它的委托方法中的 UITextField 访问 UITableViewCell?的主要内容,如果未能解决你的问题,请参考以下文章

C#委托和事件详解

C#事件与委托详解

C#事件与委托详解精华 多看看

编写高质量代码改善C#程序的157个建议——建议39:了解委托的实质

相互引用的两个类

委托+内置委托方法