在我的应用程序中,我有一个登录表单,用户输入一个字段密码。所以我在UITextField
的函数调用期间在UITableViewCell
中添加了cellForRowAtIndexPath
的子视图。
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]];
//然后我在subviews
的{{1}}进行了广告,并从cell
子视图中提取了用户输入的密码。
UITextField
这在for (UIView *view in cell.subviews) {
if ([view isKindOfClass:[UITextField class]]) {
usernameField = (UITextField *)view;
break;
}
}
在网上搜索后,跟踪IOS 7
Apple更改IOS 7
的视图层次结构的问题,现在又插入了其他类UITableViewCell
。
我在我的选择器功能登录中调试我的代码它正在获取我添加了UITableViewCellScrollView
的同一单元格我打印subview
的名称显示cell.subview
之前显示的UITableViewCellScrollView
UITableViewCellcontentView
(ios7
之前)
如何从subeview
的{{1}}中提取密码?
答案 0 :(得分:1)
最简单的方法是为您的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;
}
答案 1 :(得分:1)
cellForRowAtIndexPath:
方法不适合添加子视图,而是操纵它们。
您应该创建一个UITableViewCell
的子类,其@property UITextField
被添加到initWithStyle:reuseIdentifier:
方法中的单元格中。
[self.contentView addSubview:self.passwordField];
然后,您可以使用UITextField
或您想要的任何内容访问此特定[cell passwordField]
。
答案 2 :(得分:0)
我相信您需要获取UITableViewCellScrollView
。
不是将文本字段添加到单元格,而是将UITextField
添加到cell.contentView
,并在textField
的子视图中查找cell.contextView
。
我认为从长远来看,对于您的解决方案而言,最好的方法是创建自定义UITableViewCell
,然后在其中添加textField
。您可以直接访问文本字段,而无需遍历cell.contentView
。
答案 3 :(得分:0)
你可以做两件事: 如果整个viewcontroller只有一个textfield,则定义一个包含对passwordTextField的引用的属性
@property(strong, nonatomic) UITextField *passwordTextfield;
或者,如果每个tableviewCell都有一个文本字段,则可以定义一个UITextFields集合
@property(strong, nonatomic) NSMutableArray *textFields;
然后你可以用:
引用你的passwordTextFieldUITextField *passwordField = self.textFields[PASSWORD_ROW];