Как я должен в идеале создать хорошо структурированный UITableViewDataSource?
У меня есть NSArray
песен, извлеченных с сервера. Это мой источник необработанных данных. Массив содержит пользовательские объекты, которые имеют NSDictionary
а также NSArray
в качестве бэкэнда.
Мне интересно, если реализация отформатированного источника данных с использованием NSDictionary
будет мудрым. Словарь будет иметь заголовки разделов в качестве ключей, а значение определенного ключа будет иметь NSArray
содержащие строки для этого раздела.
Я буду перебирать свой источник необработанных данных и размещать его в алфавитном порядке в словаре.
У меня такое ощущение, что это не солидная реализация и очень дорогая. Есть ли другая, более надежная реализация, чем эта?
3 ответа
Для небольших столов, а не NSDictionary
Я вообще пользуюсь NSArray
, поскольку словари не сохраняют порядок (и вы, вероятно, не хотите постоянно пересортировать). Поэтому у меня обычно есть массив разделов, для которых у меня есть для каждой записи раздела, по крайней мере, заголовок раздела и массив строк. Мой массив строк содержит ту информацию, которая мне нужна для представления данной строки (например, текст строки и т. Д.).
Отдельные объекты строки и раздела, вы можете реализовать их как NSDictionary
сами объекты (и иногда при анализе данных из JSON или XML, это проще всего), но я обычно определяю свой собственный Row
а также Section
объекты, например:
@interface Row : NSObject
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *subtitle;
@end
а также
@interface Section : NSObject
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSMutableArray *rows;
@end
Тогда у моего контроллера табличного представления есть NSArray
для разделов:
@property (nonatomic, strong) NSMutableArray *sections;
И я наполняю это так:
self.sections = [NSMutableArray array];
Section *sectionObject;
sectionObject = [[Section alloc] initWithTitle:@"Marx Brothers" rows:nil];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Chico" subtitle:@"Leonard Marx"]];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Harpo" subtitle:@"Adolph Marx"]];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Groucho" subtitle:@"Julius Henry Marx"]];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Zeppo" subtitle:@"Herbert Manfred Marx"]];
[self.sections addObject:sectionObject];
sectionObject = [[Section alloc] initWithTitle:@"Three Stooges" rows:nil];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Moe" subtitle:@"Moses Harry Horwitz"]];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Larry" subtitle:@"Louis Feinberg"]];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Curly" subtitle:@"Jerome Lester \"Jerry\" Horwitz"]];
[self.sections addObject:sectionObject];
И тогда у меня есть типичный UITableViewDataSource
методы:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [self.sections count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
Section *sectionObject = self.sections[section];
return [sectionObject.rows count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
Section *sectionObject = self.sections[section];
return sectionObject.title;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
Section *sectionObject = self.sections[indexPath.section];
Row *rowObject = sectionObject.rows[indexPath.row];
cell.textLabel.text = rowObject.title;
cell.detailTextLabel.text = rowObject.subtitle;
return cell;
}
Для больших таблиц, управляемых данными базы данных, я мог бы не хранить данные в массивах, а использовать Core Data или SQLite, но идея та же. Убедитесь, что у меня есть Section
а также Row
классы, которые сохраняют мой код контроллера табличного представления самоочевидным и изолированным от деталей реализации данных.
Вы пробовали RestKit? Все, что вам нужно, это предоставить источник json-кодированных объектов и создать классы моделей
Вы можете использовать класс модели, а затем создавать объекты этого класса модели с данными с сервера. Затем используйте массив объектов класса модели в качестве источника для вашего UITableView.
Вы также можете рассмотреть основные данные, в которых очень легко создавать модели данных и связи. Однако он поставляется с множеством дополнительных функций, которые могут быть дополнительным багажом для вас.