Я пытаюсь создать пользовательский интерфейс, чтобы пользователь мог редактировать атрибуты основного объекта данных. Когда пользователь нажимает кнопку редактирования, выбор строки будет толкать listDetailViewController
, который является только табличным представлением, отображающим атрибуты. Он использует пользовательскую ячейку представления таблицы с меткой и UITextField. listDetailViewController
отображает атрибуты правильно и будет принимать текст как предполагаемый, но я не могу понять, как получить введенный пользователем текст для сохранения.Не удалось сохранить изменения в основных атрибутах данных
Если я не объясняю ясно, вот пример. Я хочу изменить имя этого списка, поэтому я нажимаю «Редактировать», нажимаю на список, нажимаю строку «Список имен», всплывает клавиатура, набираю новое имя, нажимаю «Готово», и он возвращает меня обратно в RVC без изменений сохранены. Я несколько минут стучал головой об этом и хотел бы помочь!
Вот соответствующий код из ListDetailViewController
:
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:@selector(done)];
self.navigationItem.rightBarButtonItem = doneButton;
[doneButton release];
self.tableView.allowsSelection = NO;
self.tableView.allowsSelectionDuringEditing = NO;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return 3;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *DetailCellIdentifier = @"DetailCell";
ListDetailCell *cell = (ListDetailCell *)[tableView dequeueReusableCellWithIdentifier:DetailCellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"ListDetailCell" owner:self options:nil];
cell = listDetailCell;
self.listDetailCell = nil;
// Configure the cell...
// list name
if (0 == indexPath.row) {
cell.label.text = @"List Name";
cell.textField.text = self.selectedList.listName;
cell.textField.placeholder = @"Name";
}
// Detail 1
if (1 == indexPath.row) {
cell.label.text = @"Detail 1";
cell.textField.text = selectedList.detail1;
cell.textField.placeholder = @"Detail 1";
}
// Detail 2
if (2 == indexPath.row) {
cell.label.text = @"Detail 2";
cell.textField.text = selectedList.detail2;
cell.textField.placeholder = @"Detail 2";
}
}
return cell;
}
- (void)done {
[self.listDetailCell resignFirstResponder];
[self.navigationController popViewControllerAnimated:YES];
}
В Ивар label
и textField
объявлены в ListDetailCell
, что ячейка таблицы СИБ я упоминал ранее.
Следует ли добавить делегат в класс ячеек или метод cellForRowAtIndexPath? И клавиатура не проблема, так как кнопка «Готово» и контроллер контроллера работают так, как они предполагают. Я изменил свой пример для ясности, чтобы быть более ясным! –
Я обновил выше, чтобы добавить пример кода. Остерегайтесь опечаток, я вручную набрал его в :-) – drekka
Это сделало это, спасибо! Я все еще обволакиваю своих делегатов, и каждый новый бит помогает. :) –