尝试使用NSDictionary值设置numberOfRowsInSection

时间:2011-09-21 21:26:49

标签: iphone ios nsdictionary

我正在尝试设置我的uitableview用于索引,我已经有很多部分工作正常,现在数据在NSDictionary继承人我的输出与nslog --->

Dictionary: {
    H =     (
        Honda,
        Honda,
        Honda,
        Honda,
        Honda,
        Honda,
        Honda
    );
    M =     (
        Mazda,
        Mazda,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi
    );
    N =     (
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan
    );
    T =     (
        Toyota,
        Toyota,
        Toyota
    );

我现在正试图设置我的表

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return [arraysByLetter count];
    //return 0;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [[arraysByLetter objectAtIndex:section] count];
    //return 1;
}

然而我收到警告'NSMutableDictionary'可能无法响应我的numberOfRowsInSection委托方法中的'objectAtIndex:' ...如何绕过这个?

4 个答案:

答案 0 :(得分:1)

您不能像对待数组那样索引字典。您可以使用密钥访问字典。 NSDictionary确实提供了两种获取数组的方法:allKeys和allValues。

我不确定你要完成什么,但是如果你想按字母顺序组织汽车制造商,你可以获得所有的键([arraysByLetter allKeys]),按字母顺序排序,然后索引到那个排序的数组。当你真正获得汽车制造商的名字时,你将使用objectForKey:来加载制造商的数组。

<强>更新 假设一个名为sortedLetters的已排序数组,您可以将numberOfRowsInSection更改为以下内容:

NSString *currentLetter = [sortedLetters objectAtIndex:section];
return [[arraysByLetter objectForKey:currentLetter] count];

您可能希望在初始化时设置sortedLetters数组,除非它是动态的。

答案 1 :(得分:1)

警告消息告诉您确切的问题:arraysByLetterNSMutableDictionary而非NSArray(或其子类NSMutableArray)的实例,因此不会不回复NSArrayobjectAtIndex:方法。

相反,您应该使用NSDictionary方法objectForKey:,并传递与提供的部分编号对应的字母表字母。您可以使用switch语句或字符串数​​组来确定要选择的键。

答案 2 :(得分:1)

objectAtIndex是一个数组方法,而不是字典方法。我对表数据源使用字典的方式如下:

- (NSInteger)tableView:numberOfRowsInSection:
{
NSArray *keys = [arraysByLetter allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveComapre:)];

return [[arraysByLetter objectForKey:[sortedKeys objectAtIndex:section]] count];
}

我们必须排序的原因是因为allKeys没有按特定顺序出现并且可以更改。

答案 3 :(得分:0)

这是因为你不能在字典上使用objectAtIndex。您需要首先使用字典上的objectForKey提取字典中的对象,然后从这些对象创建一个数组。然后你可以在那个数组(数组对象数组)上使用objectAtIndex并对结果使用count。或者,一个简单的allValues消息到你的字典就足够了。

编辑:

在您的情况下,如果您需要第一部分有七行(七个Hondas),请创建一个数组并将[dictionary allValues]作为其内容。在numberOfRowsInSection方法中使用该数组,就像使用字典一样。