UITableView中各节的动态标题

时间:2011-02-08 18:25:37

标签: iphone objective-c cocoa-touch

我想制作一个包含我们商店的桌面视图 - 按城市划分。

tableview的数据通过我的webapp的API在json字符串中收集,我使用opensource Objective-c JSON框架解析为NSDictionary。

回复看起来有点像这样:

    {
city = "Amsterdam";
code = erbur;
title = "Shop Lorem";
},
{
city = "Amsterdam";
code = kadap;
title = "Shop Ipsum";
},
{
city = "Rotterdam";
code = elaml;
title = "Shop Dolor";
},
{
city = "Delft";
code = lamla;
title = "Shop Sit";
},
{
city = "Rotterdam";
code = koppa;
title = "Shop Amet";
},

我最初的计划是为每个城市创建一个数组,将这些数组存储在字典中,然后在用titleForHeaderInSection:命名部分时执行以下操作:

if (section == 0) {
    return @"Amsterdam"; }
else if (section == 1)  {
    return @"Roteterdam";
} Etc..

问题在于:我们正在迅速扩张,每次在新城开店时我都不想更新我的应用程序。所以我不能硬编码城市的数组。

确保新城市中的新商店显示在正确城市的表格视图中的正确方法是什么?

提前致谢!

修改 这是我的代码:

 - (void)getLocData
    {

        SBJSON *parser = [[SBJSON alloc] init];

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://foo.bar/locaties/lijst"]];
        [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];

        NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

        NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];

        NSArray *statuses = [parser objectWithString:json_string error:nil];

        //the abive works

        [statusesArray release];
        statusesArray = statuses;


        NSArray *cityNames = [statuses valueForKey:@"code"];


    [locationCodes release];
    locationCodes = cityNames;


    - (void)viewDidLoad {
        [super viewDidLoad];

    [self getLocData];

        //titel
        self.title = NSLocalizedString(@"Locaties", @"Locaties - Steden");



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

        return [locationCodes count];

    }


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

        return 1;

    }

    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

        return [locationCodes objectAtIndex:section];

    }


    // Customize the appearance of table view cells.
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        static NSString *CellIdentifier = @"Cell";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }

        // Configure the cell...




        NSString *cityName = [locationCodes objectAtIndex:[indexPath section]];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code like %@", cityName];

        NSArray *filteredShops = [statusesArray filteredArrayUsingPredicate:predicate];
        NSDictionary *currentShop = [filteredShops objectAtIndex:[indexPath row]];

        NSString *cellTitle = [currentShop objectForKey:@"title"];

        cell.textlabel.text = cellTitle;
        return cell;

    }

2 个答案:

答案 0 :(得分:3)

您的数据看起来好像是一个字典数组。如果是这种情况,您可以获得一系列城市名称,如下所示:

// Assuming you've stored the array in a variable named shops...
NSArray *cityNames = [shops valueForKey:@"city"];

因此,您的tableView:numberOfSections:实现只能返回该数组的计数,同样tableView:titleForHeaderInSection:只能返回由部分编号索引的cityNames中的对象。

tableView:cellForRowAtIndexPath:中,您可以使用NSPredicate的实例过滤数组:

NSString *cityName = [cityNames objectAtIndex:[indexPath section]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"city like %@", cityName];

NSArray *filteredShops = [shops filteredArrayUsingPredicate:predicate];
NSDictionary *currentShop = [filteredShops objectAtIndex:[indexPath row]];

修改

假设您只想显示每个商店的标题,您需要的只是以下内容:

NSString *title = [currentShop objectForKey:@"title"];
// Assuming you've already obtained the cell...
[[cell textLabel] setText:title];

答案 1 :(得分:0)

这是我的头脑,但是一旦你在NSDictionary中获得了数据,你就可以将它排序为NSSet并按字母顺序排序。假设:

  • 您按字母顺序列出部分
  • 您引用的库返回NSDrray of NSDictionaries
  • 键是名称,例如“城市”“代码”“标题”

正确的数据确实需要是NSDrray或NSDictionary对象的NSSet。如果是这样的话:

NSMutableSet *sectionsSet = [[NSMutableSet alloc] init];
for (NSDictionary *item in data) {
    NSDictionary *aLocation = [[NSDictionary alloc] initWithObjectsAndKeys:[item valueForKey:@"city"],@"city",nil];
    [sectionsSet addObject:aLocation];
    [aLocation release];
}

NSSortDescriptor *sortAscending = [[NSSortDescriptor alloc] initWithKey:@"city" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortAscending,nil];
NSArray *sortedSections = [[sectionsSet allObjects] sortedArrayUsingDescriptors:sortDescriptors];
[sortDescriptors release];
[sortAscending release];    

使用NSDictionary的伪NSArray测试上述内容。我认为通过将对象添加到NSDictionary中,您可以避免创建自己的NSSortDescriptor ..:/我将尝试稍后检查此代码并更新它是否已损坏。

titleForHeaderInSection代码将简单地为:

返回[sortedSections objectAtIndex:section];

现在看到城市按字母顺序排序,上面的代码会按顺序返回。对于你的例子,它将给出三个部分:

0 ==阿姆斯特丹 1 ==代尔夫特 2 ==鹿特丹

检索有问题的部分/单元格所需的行的最简单方法是确保首先正确排序NSArray。

当然,您需要更改执行排序的代码,以将创建的数据分配给类属性,而不是我在示例中使用的本地创建的sortedSections。

注意事项:

  • 排序区分大小写,数据不规则会产生问题。阿姆斯特丹!=阿姆斯特丹!= aMsterdam等。