如何用标题索引uitableview iOS的对象组成一个数组?

时间:2017-01-04 14:09:41

标签: ios objective-c arrays uitableview

我正在制作一个标题索引事件邀请列表。我有一个包含EventStatus个对象的数组。我正在为表格制作_data数组,

for (int i = 0; i < eventStatusList.count; i++) {
    NSString *firstName = ((OCEventStatus*)eventStatusList[i]).user.firstName;
    [_sortedUsers setObject:((OCEventStatus*)eventStatusList[i]).user.firstName forKey:[firstName substringToIndex:1]];
}
_sortedUserTitles = [[[_sortedUsers allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] mutableCopy];

_data = [eventStatusList mutableCopy];
[self.dataTableView reloadData];

我觉得这个for循环的东西太慢了。有没有办法以良好的方式做到这一点?以下是使用UITablrViewDataSource方法构成逻辑的标题索引。

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    NSString *sectionTitle = [_sortedUserTitles objectAtIndex:section];
    NSArray *sectionUsers = [_sortedUsers objectForKey:sectionTitle];
    return [sectionUsers count];

}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    //  return animalSectionTitles;
    return _alphabetArray;
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    return [_sortedUserTitles indexOfObject:title];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
   return [_sortedUserTitles objectAtIndex:section];
}

这是错误,因为_sortedUsers字典中有一个字符串而不是一个数组。我该如何解决这个问题?还请建议一种快速,好的方式来实现这个标题索引。

1 个答案:

答案 0 :(得分:2)

如果您想创建一个名字列表,请尝试这样做。

在界面:

@property(nonatomic, strong)NSMutableDictionary *dict;
@property(nonatomic, strong)NSMutableArray *alphabet;
_dict = [NSMutableDictionary new];
_alphabet = [NSMutableArray new];
[eventStatusList sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
    OCEventStatus *ev1 = (OCEventStatus*)obj1;
    OCEventStatus *ev2 = (OCEventStatus*)obj2;
    return [ev1.firstName compare:ev2.firstName];
}];

for(OCEventStatus *state in eventStatusList){
    NSString *firstchar = [[state.firstName substringToIndex:1] lowercaseString];
    if([dict objectForKey:firstchar]==nil){
         NSMutableArray *tmp = [NSMutableArray new];
        [tmp addObject:state];
        [_dict setObject:tmp forKey:firstchar];
        [_alphabet addObject:firstChar];
    }else{
        [[dict objectForKey:firstchar] addObject:state];
    }
}

现在,你在Dictionary中有一个firstnames数组,第一个字母作为例子的键:a - &gt; [ “阿尔弗雷德”, “阿尔伯特”,...]

在Datasource方法中,你必须像这样返回它......

-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView{
 return dict.count;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection;(NSInteger)section
{
    return [dict objectForKey:[alphabet objectAtIndex:section]].count;
}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
OVEventStatus *state =  [[dict objectForKey:[alphabet objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
cell.textLabel.text = state.firstName;
    return cell;

}

如果这适合你,请试试

更新:

如果您还想对数组进行排序,我建议先对eventListBy firstName进行排序!所以当你遍历eventStatusList时,你有正确的顺序。