Ios 如何循环遍历节的每个UITextfield?

Ios 如何循环遍历节的每个UITextfield?,ios,iphone,objective-c,uitableview,Ios,Iphone,Objective C,Uitableview,今天早些时候,我问了一个关于文本字段的问题。现在我被困在如何循环每个UITextFields中 如何循环遍历节的每个UITextfield 以下是我目前的代码: - (IBAction)ForwardReport:(id)sender { NSLog(@"PRESSED"); for (UITableViewCell *cell in [self.tableView.indexPathsForVisibleRows]) { if ([cell isKindOfCl

今天早些时候,我问了一个关于文本字段的问题。现在我被困在如何循环每个UITextFields中

如何循环遍历节的每个UITextfield

以下是我目前的代码:

- (IBAction)ForwardReport:(id)sender {
    NSLog(@"PRESSED");
    for (UITableViewCell *cell in [self.tableView.indexPathsForVisibleRows]) {
        if ([cell isKindOfClass:[UITextField class]]) {
            UITextField *textField = (UITextField *)cell;
            NSLog(@"UITEXTFIELD TEXT = %@", textField.text);
        }
    }
}
我尝试了以下步骤,但不幸的是我的代码无法编译

我不确定在UItableView委托之外时如何访问第1节(第二节)

我希望遍历每个UITextfield,并检索其文本值

请注意:

这是一个屏幕截图


我想我的另一个选择是为每个字段创建IBoutlets,并有一堆if/else语句,但听起来有点混乱……

您应该在单元格的子视图中而不是在单元格中搜索UITextField

试着跟随

- (IBAction)ForwardReport:(id)sender {
    NSLog(@"PRESSED");
    for (UITableViewCell *cell in self.tableView.visibleCells) {
        for (UIView *subview in [cell.contentView subviews])
            if ([subview isKindOfClass:[UITextField class]]) {
                UITextField *textField = (UITextField *) subview;
                NSLog(@"UITEXTFIELD TEXT = %@", textField.text);
            }
        }
    }
}

在AVT的回答中,去掉for循环中self.tableView.visibleCells周围的括号。然后它会读到

for (UITableViewCell *cell in self.tableView.visibleCells)
那么下一个for循环实际上应该使用单元格的内容视图的子视图:

for (UIView *subview in [cell.contentView subviews])
然而,这些都是小问题

还有一个更重要的设计问题。您不应该在当前可见的单元格中循环。表视图单元格是暂时的。如果用户从屏幕上滚动一个表视图单元格,它的内容将被丢弃并丢失


当用户输入信息时,您应该从单元格中的视图对象收集信息:开关和分段控件应该连接到插座,这些插座可以立即将用户的更改保存到数据模型中。同样,对于文本字段,您需要设置一个委托,并在用户输入完内容后立即收集用户的输入,并将其保存到数据模型中。

代码中有两个错误

第一个问题:

UITableViewCell *cell in [self.tableView.indexPathsForVisibleRows]
UITextField *textField = (UITextField *)cell;
无法工作,因为
self.tableView.indexPathsForVisibleRows
返回
indexPath
s数组,而不是
UITableViewCell
。试试这个:

- (IBAction)ForwardReport:(id)sender {
    NSLog(@"PRESSED");
    for (NSIndexPath *indexPath in [self.tableView indexPathsForVisibleRows]) {
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

        ...

    }
}
第二个问题:

UITableViewCell *cell in [self.tableView.indexPathsForVisibleRows]
UITextField *textField = (UITextField *)cell;
UITextField
不是
UITableViewCell
的子类,因此不能将表视图单元格强制转换为文本字段。相反,您必须迭代单元格中包含的所有子视图。因此,整个方法是:

- (IBAction)ForwardReport:(id)sender {
    NSLog(@"PRESSED");
    for (NSIndexPath *indexPath in [self.tableView indexPathsForVisibleRows]) {
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
        for (UIView *subview in cell.subviews)
            if ([subview isKindOfClass:[UITextField class]]) {
                UITextField *textField = (UITextField *)subview;
                NSLog(@"UITEXTFIELD TEXT = %@", textField.text);
            }
        }
    }
}

(注意:我还没有测试这段代码。)

我的建议是不要这样做。由于可重用性,您不能依赖嵌入在tableView单元格中的
UITextField
的内容

视图控制器应直接绑定到模型,因此,更改文本字段中的文本应立即更新模型,因此,当您滚动并重新使用单元格时,会指定适当的值。当你点击“forward”时,你只需查询模型的内容(当然,它可能是一个简单的
NSMutableArray

让我们添加一个NSMutableArray,其空字符串的数量与文本字段的数量相同(例如5):

标记用于标识每个单元格,其他选项是创建自己的
UITextField
子类或使用自定义的
setValueForKey:

无论您选择什么,当您获得委托方法(
UITextFieldDelegate
)时,请对照首选方法进行检查,在我的情况下标记:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *replaced = [textField.text stringByReplacingCharactersInRange:range withString:string];

    _textFieldValues[(textField.tag - 100)] = replaced;

    return YES;
}
这将使模型始终保持最新,您不需要在数组上迭代文本字段:

// Method that gets called when hitting forward
- (IBOutlet)didPressForwardButton:(UIButton*)sender
{
    for (NSString *text in _textFieldValues)
    {
        NSLog(@"UITEXTFIELD TEXT = %@", text);
    }
}

课程:使用
UITableView
时,应始终将视图上的内容映射到模型上的内容,并立即更新,不能依赖视图来保存数据。事实上,这应该扩展到您在iOS中所做的任何事情,视图是用于显示的。如果不能立即修改真实模型,则必须将其封装在“transaction”中间对象中,然后更新真实模型。

第一个for循环没有编译,我相信是因为
[self.tableView.indexPathsForVisibleRows]
它的错误。。。不知何故,我只需要循环遍历
indexPath.section==1
,但不确定如何在IBActionYou内部执行此操作<此处应使用代码>可见单元格。请检查更新后的答案。仍然没有编译,你们知道我如何调整它,使之只循环通过第1节吗?好的。我刚刚打开了Xcode并检查了代码<应使用代码>self.tableView.visibleCells而不是
[self.tableView.visibleCells]
。我已经更新了答案。即使你知道怎么做,也很难写出白纸IDE。很有可能会犯一些愚蠢的错误。你说得对,现在已经编译好了,对不起,我是新来的,所以我没有完全理解最后一段。快速提问:这段代码怎么只在第1部分循环,我没有看到那个检查,因为我在其他部分有文本字段?我想确保它不会出现在其他部分。@Duncan C所说的是(如果我错了,请纠正我):您的类中应该有一个数据结构(可能是
NSMutableArray
属性),它保存您希望在视图中显示的数据。在
-forwardReport
方法中,您可以通过调用
[self.yourary objectAtIndex:x]
轻松访问所需字符串,而不是迭代单元格中包含的所有子视图,这相当复杂,可能会导致其他问题。每当用户更改文本字段中的文本时,都应该通过替换数组中的相应值来更新数据结构。(->MVC)米沙,这和我说的差不多。我的意思是,您不能将状态数据存储在表视图单元格中,而期望它能够持久存在。它不能可靠地工作。表视图单元格是视图对象。当用户将数据输入表视图单元格中的视图时,应在用户完成每次编辑后将数据复制到模型中。然后,当您需要当前数据时,它总是在模型中。是的,数组通常是表视图模型的良好结构。或者可能是一个数组数组,对于一个分区表视图(外部数组用于分区,内部数组用于行)@Duncan C,这甚至更像p