2

我有一NSArray首从服务器获取的歌曲。那是我的原始数据源。该数组包含具有NSDictionaryNSArray作为后端的自定义对象。

我想知道使用 an 来实现格式化的数据源NSDictionary是否明智。字典将部分标题作为键,并且某个键的值将NSArray包含该部分的行。

我将遍历我的原始数据源并将其按字母顺序排列到字典中。

我有一种感觉,这不是一个可靠的实现,而且非常昂贵。还有比这更可靠的实现吗?

4

3 回答 3

2

对于小表,而不是NSDictionary,我通常使用NSArray,因为字典不保留顺序(而且您可能不想不断地重新排序)。所以我通常有一个节数组,对于每个节条目,我至少有一个节标题和一个行数组。我的行数组具有我需要呈现给定行的信息(例如行的文本等)。

单独的行和部分对象,您可以将它们实现为NSDictionary对象本身(有时在从 JSON 或 XML 解析数据时,这是最简单的),但我通常定义自己的对象RowSection对象,例如:

@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,但想法是一样的。确保我的类SectionRow类可以使我的表视图控制器代码不言自明,并与数据实现的细节隔离开来。

于 2013-02-23T20:33:17.930 回答
1

你试过 RestKit 吗?您只需要提供 json 编码对象的来源并创建模型类

于 2013-02-23T16:46:41.963 回答
0

您可以使用模型类,然后使用来自服务器的数据创建此模型类的对象。然后使用模型类对象数组作为 UITableView 的源。
您还可以考虑core-data,在其中创建数据模型和关系非常容易。但是,它带有许多附加功能,这对您来说可能是额外的负担。

于 2013-02-23T17:24:04.360 回答