添加UITextField作为UITableViewCell的子视图,在IOS 6中工作正常,但在IOS 7中不工作?
在我的应用程序中,我有一个登录表单,用户在其中输入一个字段密码。因此,我在添加UITextField作为UITableViewCell的子视图,在IOS 6中工作正常,但在IOS 7中不工作?,ios,iphone,uitableview,ios7,uitextfield,Ios,Iphone,Uitableview,Ios7,Uitextfield,在我的应用程序中,我有一个登录表单,用户在其中输入一个字段密码。因此,我在cellforrowatinexpath的函数调用期间,在UITableViewCell中添加了一个子视图UITextField UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"loginViewCell"]; UITextField *editable
cellforrowatinexpath
的函数调用期间,在UITableViewCell
中添加了一个子视图UITextField
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"loginViewCell"];
UITextField *editableTextField = nil;
// Done Some settings of editableTextField
// Adding Subview
[cell addSubview:editableTextField];
当用户按下登录按钮时,我调用了一个选择器函数名login
UITableViewCell *cell = [loginTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
//然后我进入单元格的子视图
,并从UITextField
子视图中提取用户输入的密码
for (UIView *view in cell.subviews) {
if ([view isKindOfClass:[UITextField class]]) {
usernameField = (UITextField *)view;
break;
}
}
直到IOS 7
在网上搜索后,我发现了一个问题,即在IOS 7中,Apple更改了UITableViewCell
的视图层次结构,现在插入了额外的类UITableViewCellScrollView
我在选择器函数login中调试代码,它得到的单元格与我在其中添加的子视图
相同,我打印了单元格的名称。子视图
正在显示UITableViewCellScrollView
之前显示的是UITableViewCellcontentView
(在ios7
之前)
如何从
UITableViewCell
的subeview
中提取密码?我相信您需要获取UITableViewCell滚动视图的子视图
不要将文本字段添加到单元格中,而是将UITextField
添加到cell.contentView
,然后在cell.contextView
的子视图中查找textfield
不过,我认为从长远来看,对于您的解决方案来说,最好的方法是创建一个自定义的UITableViewCell
,并在其中添加textField
。您可以通过这种方式直接访问文本字段,而不必在单元格的子视图中循环。contentView
最简单的方法是对UITableView单元格进行子类化,并添加一个作为UITextField的类属性。然后您可以只调用cell.textField.text
,而不是在视图层次结构中进行搜索
第二种方法是递归搜索整个视图层次结构,而不仅仅是一层子视图。(您应该搜索单元格。无论如何,当您直接将视图添加为单元格的子视图时,会发生不好的情况。)
编辑添加代码以通过视图层次结构进行递归搜索。我不推荐这种方法,我建议将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;
}
cellforrowatinexpath:
方法不是添加子视图的正确位置,而是用来操作它们的。
您应该真正创建一个子类UITableViewCell
,该子类具有一个@property UITextField
,该属性被添加到initWithStyle:reuseIdentifier:
方法中的单元格中
[self.contentView addSubview:self.passwordField];
然后,您可以使用[cell passwordField]
或任何您想调用的方法访问此特定的UITextField
。您可以做两件事:
如果整个viewcontroller只有一个textfield,则可以定义一个属性来保存对passwordTextField的引用
@property(strong, nonatomic) UITextField *passwordTextfield;
或者,如果每个tableviewCell都有一个textfield,则可以定义UITextFields的集合
@property(strong, nonatomic) NSMutableArray *textFields;
然后,您可以使用以下内容引用passwordTextField:
UITextField *passwordField = self.textFields[PASSWORD_ROW];
确保将子视图添加到单元格的contentView,而不是单元格本身。如果不想将UITableView单元格分为子类,可以通过标记引用子视图。设置UITextField实例的标记并添加它,然后您可以稍后通过以下方式引用它:UITextField*tf=[cell.contentView viewWithTag:1];如何搜索整个视图层次结构?我在cell.subviews
上尝试了此操作,但它只显示了一个视图,即UITableViewCellScrollView
编辑以显示通过视图层次结构进行递归搜索的代码。