如果将相同的标记值分配给多个文本字段并且对所有文本字段使用相同的委托,则tag 属性将不起作用。
以下是通过为每组文本字段使用不同委托来解决此问题的实现。
TextFieldArrayManager 管理一组文本字段及其数据。它充当其管理的文本字段的委托。
@interface TextFieldArrayManager : NSObject <UITextFieldDelegate>
@property NSMutableArray *textItems;
@end
@implementation TextFieldArrayManager
- (void)textFieldDidEndEditing:(UITextField *)textField {
if (_textItems.count >= textField.tag + 1) {
if (textField.text) {
_textItems[textField.tag] = textField.text;
}
else {
_textItems[textField.tag] = @"";
}
}
}
@end
视图控制器使用单独的TextFieldArrayManager 来管理名字和姓氏。
@interface ObjcTableViewController ()
@end
@implementation ObjcTableViewController
TextFieldArrayManager *firstNames;
TextFieldArrayManager *lastNames;
- (void)viewDidLoad {
[super viewDidLoad];
firstNames = [[TextFieldArrayManager alloc] init];
firstNames.textItems = [NSMutableArray arrayWithObjects:@"George", @"Ludwig", @"Wolfgang", nil];
lastNames = [[TextFieldArrayManager alloc] init];
lastNames.textItems = [NSMutableArray arrayWithObjects:@"Handel", @"Beethoven", @"Mozart", nil];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return firstNames.textItems.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
ObjcTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.firstName.delegate = firstNames;
cell.firstName.text = firstNames.textItems[indexPath.row];
cell.firstName.tag = indexPath.row;
cell.lastName.delegate = lastNames;
cell.lastName.text = lastNames.textItems[indexPath.row];
cell.lastName.tag = indexPath.row;
return cell;
}
要向表中添加一个新的空行,您可以这样做:
[firstNames.textItems addObject:@""];
[lastNames.textItems addObject:@""];
[self.tableView reloadData];
当用户输入文字时,会保存到textItems中。