订购从pList加载的UITableView部分

时间:2011-10-02 16:43:18

标签: iphone objective-c xcode4

我有一个分段的UITableView被来自pList的数据填充。 pList的根是一个字典,这个字典的每个键都被加载到一个数组中,该数组用于定义节标题(并且可能是顺序)。

目前我的部分以随机顺序出现在表格中,我想按照它们出现在pList中的顺序排序,或者至少通过按字母顺序排列部分来伪造它们。

我理解字典没有顺序,这就是输出不反映pList顺序的原因,但我不想将根更改为数组,因为它需要我重写我的应用程序的块,加上Xcode 4似乎更喜欢使用字典作为根。当然,如果更改pList结构是最好的方法,我会继续使用它。

pList示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"   "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Section A</key>
    <array>
        <dict>
            <key>Details</key>
            <string>Details Here...</string>
            <key>Image</key>
            <string>X.png</string>
            <key>Name</key>
            <string>Person X</string>
        </dict>
        <dict>
            <key>Details</key>
            <string>Details Here...</string>
            <key>Image</key>
            <string>Y.png</string>
            <key>Name</key>
            <string>Person Y</string>
        </dict>
    </array>
    <key>Section B</key>
    <array>
        <dict>
            <key>Details</key>
            <string>Details Here...</string>
            <key>Image</key>
            <string>Z.png</string>
            <key>Name</key>
            <string>Person Z</string>
        </dict>
    </array>
</dict>

'TableViewController.m'中的代码:

- (void)viewDidLoad {

[super viewDidLoad];

NSString *path = [[NSBundle mainBundle] pathForResource:@"Team" ofType:@"plist"];
NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:path];
self.teamDictionary = tempDict;
[tempDict release];

NSArray *tempArray = [[NSArray alloc] init];
self.teamArray = tempArray;
[tempArray release];

self.teamArray = [self.teamDictionary allKeys];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

return [self.teamArray count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return [[self.teamDictionary valueForKey:[self.teamArray objectAtIndex:section]] count];
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

// this is here because I am altering the appearance of the header text
UIView* customView = [[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, tableView.bounds.size.width, 44.0)] autorelease];

UILabel * headerLabel = [[UILabel alloc] initWithFrame:CGRectZero];

// some custom formatting stuff has been removed from here...

headerLabel.text = [self.teamArray objectAtIndex:section];
[customView addSubview:headerLabel];
[headerLabel release];

return customView; 
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

NSUInteger section = [indexPath section];
NSUInteger row = [indexPath row];
NSString *key = [teamArray objectAtIndex:section];
NSArray *teamMember = [teamDictionary objectForKey:key];

static NSString *SectionsTableIdentifier = @"SectionsTableIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SectionsTableIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SectionsTableIdentifier] autorelease];
}

// Configure the cell...

NSDictionary *name = [teamMember objectAtIndex:row];
cell.textLabel.text = [name objectForKey:@"Name"];
}

1 个答案:

答案 0 :(得分:3)

我可以想到两个选择:

  1. 使用数组作为plist的根目录。数组中的每个项目都是一个字典,有两个键:名称/标题和项目。名称/标题将是一个字符串,而项目将是一个数组。

  2. 保持你的plist按字母顺序排列:

    NSArray *sortedKeys = [[dict allkeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]];