Iphone 尝试使用NSDictionary值设置numberOfRowsInSection

Iphone 尝试使用NSDictionary值设置numberOfRowsInSection,iphone,ios,nsdictionary,Iphone,Ios,Nsdictionary,我正在尝试设置uitableview以编制索引,我有许多节工作正常,现在数据在NSDictionary中,这是我的nslog输出---> 我现在正试着这样摆桌子 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return [arraysByLetter count]; //return 0; } - (NSInte

我正在尝试设置uitableview以编制索引,我有许多节工作正常,现在数据在NSDictionary中,这是我的nslog输出--->

我现在正试着这样摆桌子

- (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;
}

但是,我收到一条警告,在我的numberOfRowsInSection委托方法中,“NSMutableDictionary”可能不会响应“objectAtIndex:”。。。如何解决这个问题?

不能像索引数组那样索引字典。您可以使用键访问字典。NSDictionary提供了两种获取数组的方法:allKeys和AllValue

我不知道你想完成什么,但是如果你想按字母顺序组织汽车制造商,你可以得到所有的钥匙([arraysByLetter allKeys]),按字母顺序排序,然后索引到排序的数组中。当您实际获得汽车制造商的名称时,您将使用objectForKey:加载制造商数组

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

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

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

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

编辑:


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

警告消息准确地告诉您问题所在:
arraysByLetter
NSMutableDictionary
的实例,而不是
NSArray
(或其子类,
NSMutableArray
),因此不对
objectAtIndex:
NSArray
方法做出响应


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

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

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

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

我们必须排序的原因是,所有键都没有特定的顺序,可以更改。

我正在尝试为uitableview滚动创建一个节索引。。这对ars来说是一个巨大的痛苦。我正在使用一个我一直展示的解决方案,但我在让这部分正常工作方面遇到了困难。好的,我完全理解发生了什么,他们只需要正确地获取我的字母数组:)谢谢,我会让你知道我是怎么做的。是的,这是可行的!非常感谢你!整整一周的斗争几乎就要结束了:)我明白你说的话,现在就试试看。谢谢你,我已经完成了你所说的,现在itableview可以正常工作了。。现在只需使用名称初始化tableviewcells。再次感谢您,我现在已经设置了所有的tbales(即,每个节有适当数量的节和单元格)。我现在想知道的是如何使用NSDictionary值设置uitableviewcell textlabel。您知道怎么做吗?当然,您使用了与以前相同的排序,但通过传递[[arraysByLetter objectForKey:[sortedKeys objectAtIndex:section]objectAtIndex:[indexPath行]]或类似的内容。
- (NSInteger)tableView:numberOfRowsInSection:
{
NSArray *keys = [arraysByLetter allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveComapre:)];

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