我的建议是不这样做。由于可重用性,您不能依赖嵌入在 tableView 单元格中的 UITextField 的内容。
您的视图控制器应该直接绑定到模型,因此,更改 textField 中的文本应该立即更新您的模型,因此,当您滚动并重用单元格时,会分配正确的值。当您点击“前进”时,您只需查询模型的内容(无论如何,这可能是一个简单的NSMutableArray)。
让我们添加一个 NSMutableArray,其中包含与 textField 一样多的空字符串(例如 5 个):
- (instancetype)initWithWhatever...
{
self = [super initWithWhatever];
if (self)
{
_textFieldValues = [NSMutableArray arrayWithCapacity:5];
for (NSInteger i=0; i < 5; i++)
{
_textFieldValues[i] = @"";
}
}
return self;
}
确保每个文本字段都指向 cellForRowAtIndexPath: 上的 viewController。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
myCell.textField.text = _textFieldValues[indexPath.row];
myCell.textField.tag = 100 + indexPath.row;
myCell.textField.delegate = self;
return myCell
}
标签用于识别每个单元格,其他选项是创建自己的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 中所做的任何事情,视图是用于展示的。如果您不能立即修改真实模型,则必须将其封装在“事务”中间对象中,然后更新真实模型。