EDIT: Есть ли у кого-то, кто имеет полезные ссылки по этой теме? Я имею в виду хорошие практики написания многоразового кода и «абстракции»?Abstracting UIViewController как какао
Т.Л., др - прочитать этот комментарий Abstracting UIViewController like Cocoa ones
У меня есть 3 UITableViewController
:
CategoriesViewController
RecipesViewController
IngredientsViewController
Они иерархически. Ниже приведен пример иерархии:
- Десерт (категория)
- Домовой (рецепт)
- Молоко (ингредиент)
- Шоколад (ингредиент)
- масло (ингредиент)
- Домовой (рецепт)
Каждый из них имеет аналогичные функциональные возможности с другими. Например, у всех их есть сортировка (перемещение строк), удаление, добавление (представление модального вида) и т. Д.
В настоящее время я повторил весь код для каждого контроллера вида, который настраивает части, относящиеся к каждому из них. Например все они имеют переменную экземпляра так:
CategoriesViewController.m
:
@implementation CategoriesViewController {
NSMutableArray *categories;
}
RecipesViewController.m
:
@implementation RecipesViewController {
NSMutableArray *recipes;
}
IngredientsViewController.m
:
@implementation IngredientsViewController {
NSMutableArray *ingredients;
}
Потому что я думаю, что есть лучший способ организовать этот контроллер представления Я попытался создать ske leton из MyListViewController.h
:
@interface MyListViewController : UITableViewController
@property (nonatomic, strong) NSMutableArray *list;
@end
MyListViewController.m
:
@implementation MyListViewController
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [_list count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ListCell"];
id currentObject = [_list objectAtIndex:indexPath.row];
cell.textLabel.text = [currentObject valueForKey:@"name"];
return cell;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
// get item to delete
id object = [_list objectAtIndex:indexPath.row];
// remove it from list
[_list removeObjectAtIndex:indexPath.row];
// call callback
[self didFinishDeletingItem:object];
// delete row from tableview
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}
- (void)didFinishDeletingItem:(id)item
{
}
Таким образом, когда я подклассы это я только назначить list
Ивар моей структуры данных. И я могу даже переопределить методы, такие как didFinishDeletingItem:
для настройки поведения каждого контроллера.
Потому что это первый раз, когда я хотел бы использовать лучшие практики написания и организацию коды таким образом, я хотел бы знать ваше мнение, и которые являются лучшим способом для абстрактных классов для многократного использования их правильно после DRY принципа.
Вы сказали, что «MyListViewController может видеть, какие типы объектов содержатся в NSArray», но я не хочу жестко кодировать инструкции if для каждого типа 'UITableViewCell'. Я хочу сделать «MyListViewController» максимально абстрактным, чтобы повторно использовать его, когда захочу, и БЕЗ внесения изменений в самом классе. Я думаю, что именно так создаются классы Cocoa-Touch. Вы не можете видеть реализацию этих классов, но вы можете использовать их практически для каждой ситуации, благодаря их абстракции. –
Правда. Но для этого необходимо, чтобы данные были представлены таким же образом. Если вы хотите, чтобы представление зависело от данных, вам нужно будет проверить данные. Тем не менее, вы правы. – Joride
Спасибо человеку. Были ли у вас интересные ссылки по этой теме (проверить обновление сообщений)? –