添加UITextField作为UITableViewCell的子视图在IOS 6中正常工作但在IOS 7中它不起作用?

时间:2014-01-28 14:10:41

标签: ios iphone uitableview ios7 uitextfield

在我的应用程序中,我有一个登录表单,用户输入一个字段密码。所以我在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 UITableViewCellcontentViewios7之前)

如何从subeview的{​​{1}}中提取密码?

4 个答案:

答案 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;

然后你可以用:

引用你的passwordTextField
UITextField *passwordField = self.textFields[PASSWORD_ROW];