我的应用程序中有一个原型表,我填充了一个带有UITextField的customTableViewCell类。
在我的导航栏中,我收到了一个保存按钮。
问题是,如何访问这个动态创建的单元格以获取UITextField内容?
这是我的代码,你可以看到我试图使用NSMutableArray
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"customTableCell";
customTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
[self.pfCells addObject:cell];
if(cell == nil)
{
cell = [[customTableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
// Configuration
cell.lblName.text = [self.pfFields objectAtIndex: [indexPath row]];
cell.txtType = [self.pfTypes objectAtIndex: [indexPath row]];
if ([[self.pfTypes objectAtIndex:[indexPath row]] isEqualToString: @"n"]) {
[cell.txtField setKeyboardType:UIKeyboardTypeNumberPad];
} else if ([[self.pfTypes objectAtIndex:[indexPath row]] isEqualToString: @"m"]) {
[cell.txtField setKeyboardType:UIKeyboardTypeEmailAddress];
}
return cell;
}
答案 0 :(得分:0)
这是从UITableViewCell中包含的UITextField保存内容的另一种方法:
如果您每次更改文本字段值时都不需要遍历整个tableview,那么此实现的最大优点是。
答案 1 :(得分:0)
快速回答:
#pragma mark - UITextFieldDelegate
- (void)textFieldDidEndEditing:(UITextField *)textField
{
// grab the row we are working on
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
// remove the old key/value pair if it exists and add the new one
[self.modelDictionary removeObjectForKey:indexPath];
[self.modelDictionary setObject:textField.text forKey:indexPath];
}
确保在配置单元格时添加cell.txtField.delegate = self
。然后在保存按钮中,您将遍历字典并保存值 - 或者只保存字典本身。
此外,如果您的目标是iOS6或更高版本,请使用dequeueReusableCellWithIdentifier:forIndexPath:
,因为此方法可确保正确返回并调整大小,因此您无需检查nil并手动初始化您的单元格。
更长的回答:
您通常不希望将模型存储在视图中。除了打破MVC设计模式之外,它还会导致UITableViews
出现问题。具体来说,UITableViewCell
在滚动屏幕时会被回收。因此,您在这些字段中拥有的任何值都将丢失。如果你只有可见的行从不滚动屏幕,你可以逃脱这样做,我鼓励你完全避免这种做法。
相反,您应该将输入的值存储在模型对象的文本框中。最简单的方法是在用户输入值后使用UITextFieldDelegate's
textFieldDidEndEditing:
来获取值,然后将这些值添加到模型中。使用indexPath作为键,模型可以像NSDictionary
一样简单。