表格单元子视图迭代未找到TextField

时间:2012-10-22 16:07:31

标签: iphone objective-c uitableview subview

我创建了一个表格,其中每个单元格都包含文本标签和文本字段。我正在添加文本字段[cell addSubview:passwordField];,从视觉角度看它们是可编辑的等等....

当我尝试从文本字段中检索输入的值时,会出现问题。我遍历单元格并尝试抓取子视图(IE文本字段),但是,我的迭代只发现文本标签。

以下是我用来搜索的代码:

for(NSInteger i =0; i < [tableView numberOfRowsInSection:0]; i++){
   NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:0];
   UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
   UIView* subView = [[cell.contentView subviews]lastObject]; // I've also tried object at index here

// Anything beyond this is just matching....

我采取的另一种方法是递归搜索子视图,但是,再次没有产生任何结果。

4 个答案:

答案 0 :(得分:6)

您已在细胞的子视图中添加了textField

[cell addSubview:passwordField];

当您尝试在cell.contentView上找到它时 将您的textField添加为cell.Contentview

的子视图
[cell.contentView addSubview:passwordField];

以这种方式找到它 -

for(UIView *view in [cell.contentView subviews])
{
    if([view isKindOfClass:[UITextfield class]])
    {
       UITextField *textField = (UITextField *)view;
       NSLog(@"%@",textField.text);
    }
}

答案 1 :(得分:2)

为什么不将数据源映射到TableView,只检索/更新数据源中的值。然后,您可以调用reloadRowsAtIndexPaths加载刚刚更改的行。尝试迭代TableView而不仅仅是更新数据源似乎非常低效。

答案 2 :(得分:2)

而不是UIView* subView = [[cell.contentView subviews]lastObject];,您可以尝试将其命名为:

for(UIView *view in [cell subviews])
{
  if([view isKindOfClass:[UITextfield class]]){
    // view is the reference to your textfield
  }
}

通过这种方式,您可以将其他UIView添加为子视图,并且仍然可以获取文本字段的引用,而无需跟踪其子视图索引。

答案 3 :(得分:0)

我发生了两件事:

  1. 从长远来看,创建一个包含UITableViewCell UITextField的{​​{1}}会更容易,该{{1}}可作为属性访问。您可以使用nib来布局单元格,也可以在单元格init方法中以编程方式执行。这种方法将使您的代码更易于管理。

  2. 您需要考虑细胞重用。如果您正在重复使用单元格(您应该使用单元格),则需要在重新使用之前存储从文本字段中获取值。