Я выясняю правильный механизм для передачи данных из UITableViewCell
s в UIableViewController
(или UIViewController
).
Поиск в стековом потоке Я нашел разные способы сделать это и, наконец, янашел механизм, который работает хорошо, но я не знаю, может ли это быть правильный подход.
Это сценарий.Сначала я создал пользовательскую ячейку (связанную с интерфейсом xib) с именем DataTableViewCell
, которая расширяет UITableViewCell
.В этой ячейке есть выход для отображения (и изменения) данных и дополнительное свойство, называемое index, например:
@property (nonatomic, copy) NSIndexPath* index;
Это свойство обновляется внутри метода cellForRowAtIndexPath
в методе UITableViewController
:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
DataTableViewCell *cell = (DataTableViewCell*)[tv dequeueReusableCellWithIdentifier:kCellTableIdentifier];
if (cell == nil)
{
[[NSBundle mainBundle] loadNibNamed:@"DataTableViewCell" owner:self options:nil];
cell = (DataTableViewCell*)self.dataTableViewCellOutlet;
}
// configure the cell with data
// do stuff here...
// configure the cell with the current indexPath
cell.index = indexPath;
return cell;
}
Поскольку в ячейке можно изменять значения, мне нужно было передать данные в UITableViewController
для обновления модели.Для этого я решил использовать делегатский механизм.Итак, я создал протокол с помощью метода, подобного следующему:
- (void)updateData:(DataItem*)dataItem atIndexPath:(NSIndexPath*)index;
UITableViewController
реализует этот протокол.Таким образом, в ячейке (по отношению к некоторым событиям) я могу вызвать этот метод и корректно обновить модель.
Сказав это, я хочу задать несколько вопросов:
- Это правильный механизм для передачи данных из ячейки в контроллер?
- Правильно ли использовать свойство индекса, подобное тому, которое используется в ячейке?
- Является ли этото же самое, используя политику сохранения вместо политики копирования.В чем может быть разница?
- Поскольку решение, которое я нашел, может быть очень интригующим, возможно ли использовать вместо него блоки?
О блоках я подумал так:
Внутри ячейки создайте блок свойств, подобный следующему:
@property (nonatomic, copy) void (^updateModelOnEvent)(DataItem* dataItem);
Затем внутри метода cellForRowAtIndexPath
внутри метода UITableViewController
присвойте это свойство коду блока, подобному этому (этот код втот же уровень cell.index = indexPath;
):
// configure the cell with the current indexPath
cell.updateModelOnEvent = ^(DataItem* dataItem) {
[self.model insertObject:dataItem atIndex:indexPath.row];
};
Может ли быть верной альтернативой?В этом случае я должен использовать политику копирования или сохранения?
Заранее спасибо.