【问题标题】:Added UITextField as a subview of UITableViewCell working fine in IOS 6 but in IOS 7 it is not working?添加 UITextField 作为 UITableViewCell 的子视图在 IOS 6 中工作正常,但在 IOS 7 中它不起作用?
【发布时间】: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];

标签: ios iphone uitableview ios7 uitextfield


【解决方案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];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-27
        • 1970-01-01
        • 2015-02-20
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        相关资源
        最近更新 更多