添加 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]];

// 然后我遍历cellsubviews 并从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@)

如何从UITableViewCellsubeview 中提取密码?

【问题讨论】:

确保将子视图添加到单元格的 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 中它不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

在 UITextField 中添加逗号作为用户类型的数值

将逗号添加到数字值作为UITextField中的用户类型

处理 UItableView 中 UItextfield 的委托

在 iOS 中使用 UITextField 条目作为数组

推送一个字符串并在 UITextField 中显示

如何将文本包装在 Iphone 的 UITable 单元格中?