Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加UITextField作为UITableViewCell的子视图,在IOS 6中工作正常,但在IOS 7中不工作?_Ios_Iphone_Uitableview_Ios7_Uitextfield - Fatal编程技术网

添加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
编辑以显示通过视图层次结构进行递归搜索的代码。