添加 UITextField 作为 UITableViewCell 的子视图在 IOS 6 中工作正常,但在 IOS 7 中它不起作用?
Posted
技术标签:
【中文标题】添加 UITextField 作为 UITableViewCell 的子视图在 IOS 6 中工作正常,但在 IOS 7 中它不起作用?【英文标题】:Added UITextField as a subview of UITableViewCell working fine in IOS 6 but in IOS 7 it is not working? 【发布时间】:2014-01-28 14:10:41 【问题描述】:在我的应用程序中,我有一个登录表单,用户在其中输入一个字段密码。所以我在cellForRowAtIndexPath
的函数调用期间在UITableViewCell
中添加了UITextField
的子视图。
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"loginViewCell"];
UITextField *editableTextField = nil;
// Done Some settings of editableTextField
// Adding Subview
[cell addSubview:editableTextField];
当用户按下登录按钮时,我调用了一个选择器函数名登录
UITableViewCell *cell = [loginTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
// 然后我遍历cell
的subviews
并从UITextField
子视图中提取用户输入的密码。
for (UIView *view in cell.subviews)
if ([view isKindOfClass:[UITextField class]])
usernameField = (UITextField *)view;
break;
在ios 7
之前一直运行良好
在网上搜索后,我发现IOS 7
Apple 更改了UITableViewCell
的视图层次结构,现在插入了额外的类UITableViewCellScrollView
。
我在我的选择器函数登录中调试我的代码,它得到了与我添加subview
相同的单元格我打印cell.subview
的名称显示UITableViewCellScrollView
,之前它显示UITableViewCellcontentView
(在@之前987654338@)
如何从UITableViewCell
的subeview
中提取密码?
【问题讨论】:
确保将子视图添加到单元格的 contentView 而不是单元格本身。 如果不想继承 UITableView 单元格,可以通过标签引用子视图。设置 UITextField 实例的标签并添加它,然后您可以稍后通过以下方式引用它: UITextField * tf = [cell.contentView viewWithTag:1]; 【参考方案1】:cellForRowAtIndexPath:
方法不适合添加子视图,而是操作它们。
你真的应该创建一个UITableViewCell
的子类,并在initWithStyle:reuseIdentifier:
方法中将@property UITextField
添加到单元格中。
[self.contentView addSubview:self.passwordField];
然后您可以使用[cell passwordField]
或任何您想调用的名称访问这个特定的UITextField
。
【讨论】:
【参考方案2】:最简单的方法是将您的 UITableView 单元格子类化并添加一个类属性,即您的 UITextField。然后你可以直接调用cell.textField.text
而不是在视图层次结构中搜索。
第二种方法是递归搜索整个视图层次结构,而不仅仅是单个子视图层。 (无论如何,您都应该搜索 cell.contentView,当您直接将视图添加为单元格的子视图时会发生不好的事情。)
编辑添加代码以通过视图层次结构递归搜索。我不推荐这种方法,我推荐子类化 UITableViewCell (它会让你的喜欢变得更容易),但是你去吧。
你会调用类似的函数
UIView *yourFoundSubview = [self findTextFieldInCell:cell];
并且该函数将被定义:
-(UIView*)findTextFieldInCell:(UIView*)input
if([input isKindOfClass:[UITextField class]])
return input;
UIView *foundview;
for(UIView *view in input.subviews)
foundview = [self findTextFieldInCell:view];
if(foundview)
return foundview;
return nil;
【讨论】:
如何搜索整个视图层次结构?我在cell.subviews
上试过这个,但它只显示一个视图,即UITableViewCellScrollView
已编辑以显示通过视图层次结构进行递归搜索的代码。【参考方案3】:
我相信你需要得到UITableViewCellScrollView
的子视图。
不要将文本字段添加到单元格,而是将UITextField
添加到cell.contentView
,并在cell.contextView
的子视图中查找textField
。
我认为,从长远来看,对您的解决方案来说真正最好的是创建一个自定义 UITableViewCell
,并在其中添加 textField
。您可以通过这种方式直接访问您的文本字段,而无需遍历 cell.contentView
的子视图。
【讨论】:
【参考方案4】:你可以做两件事: 如果整个视图控制器只有 1 个文本字段,则定义一个包含对您的密码文本字段的引用的属性
@property(strong, nonatomic) UITextField *passwordTextfield;
或者,如果每个 tableviewCell 都有一个文本字段,则可以定义 UITextFields 的集合
@property(strong, nonatomic) NSMutableArray *textFields;
然后你可以参考你的passwordTextField:
UITextField *passwordField = self.textFields[PASSWORD_ROW];
【讨论】:
以上是关于添加 UITextField 作为 UITableViewCell 的子视图在 IOS 6 中工作正常,但在 IOS 7 中它不起作用?的主要内容,如果未能解决你的问题,请参考以下文章