UITableView 部分顺序不起作用

Posted

技术标签:

【中文标题】UITableView 部分顺序不起作用【英文标题】:UITableView sections order not working 【发布时间】:2015-02-05 11:40:54 【问题描述】:

我正在使用带有自定义部分标题的 tableView。一切都按预期工作,但各部分的顺序没有像我预期的那样响应。这是我正在使用的字典数据。在我想要的序列中,我希望将“即将到来”作为第一部分,将“参加”作为第二部分,但它显示的顺序与此完全相反。

tableSection = @@"Upcoming" : @[@"Amit", @"Vatsala", @"Jasmine",     @"Jasmine", @"Jasmine"],
                 @"Attended" : @[@"Kritarth", @"Rahul"] ;

请提供一些帮助!

#pragma mark - UITableView delegate    
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    return [tableSection count];


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    return 150;


- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection: (NSInteger)section 
    return 25;


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


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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *simpleTableIdentifier = @"SimpleTableCell";
    AppointmentTableCell *cell = (AppointmentTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil) 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AppointmentTableCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    
    //Configure the cell...
    NSString *sectionTitle = [tableSectionTitles objectAtIndex:indexPath.section];
    NSArray *sectionArray = [tableSection objectForKey:sectionTitle];
    cell.nameLabel.text = [sectionArray objectAtIndex:indexPath.row];
    cell.doctorImageView.image = [UIImage imageNamed:@"doctor.png"];
    [cell.nameLabel setFont:FONT_OPENSANS_LIGHT(14)];

        return cell;

【问题讨论】:

你能给我们看一些代码吗?你所有的 tableView-delegate 方法都是一个好的开始 我在删除数组后尝试了相同的代码。它仍然给了我相同的部分顺序。 对不起,我删除了我的评论,只是把它作为一个答案。 tableSectionTitles 的顺序是否符合您的要求?这应该只是确保它的顺序正确,其余的应该已经到位。 NSArray *sectionArray = [tableSection objectForKey:sectionTitle]; 字典没有定义的顺序。 我知道。但是我仍然面临这个问题,这就是我在这里发布这个的原因。 【参考方案1】:

为什么不单独为Table View 的标题创建一个数组?

_arrayTitles = @[@"Upcoming",@"Attended"];

一个数组包含两个Sections data source的数组:

NSArray *arraySectionOne=@[@"Amit", @"Vatsala", @"Jasmine", @"Jasmine", @"Jasmine"];
NSArray *arraySectionTwo=@[@"Kritarth", @"Rahul"];
_dataSource=@[arraySectionOne, arraySectionTwo];

在 'viewForHeaderInSection' 中,您从这个数组中设置标题:

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

    YourHeaderView *headerView=nil;

    headerView=[tableView dequeueReusableHeaderFooterViewWithIdentifier:@"YourHeaderView"];
    headerView.titleHeader.text = _arrayTitles[section];
    return headerView;


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView


    // Return the number of sections.
    return _arrayTitles.count;


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

    NSMutableArray *arraySection=_dataSource[section];
    return arraySection.count;

【讨论】:

那是因为目前我只有 2 个数组,但将来这个数字会增加 5-10。在那种情况下,使用 10 个不同的数组并不好。【参考方案2】:

我看到您实际上是从一个名为 tableSectionTitles 的单独数组中获取标题,并且因为您使用该数组中的字符串来获取所有行信息,它可以解释为什么顺序会不同。我在您提供的代码中没有看到 tableSectionTiltles 数组,但我最好的猜测是问题实际上来自哪里。

编辑

正如您在 cmets 中所述,tableSectionTitles 实际上是一个来自 [tableSection allKeys] 的数组;因为 NSDictionary 实际上并没有数组以它想要的任何顺序出现的顺序。您可以通过两种方式解决此问题。

以您想要的顺序手动将字典的键放入此数组中,但这会降低可扩展性。

使用 titleString 和 rowStringsArray 创建一个 NSObject 子类(将其命名为更适合您构建应用程序的名称),然后将这些对象添加到数组并使用它来生成表。

希望对你有帮助。

【讨论】:

tableSection = @@"Upcoming" : @[@"Amit", @"Vatsala", @"Jasmine", @"Jasmine", @"Jasmine"], @"Attended" : @[@"Kritarth", @"Rahul"] ; tableSectionTitles = [tableSection allKeys];这里是 tableSectionTitles 数组的描述。 这将是所有密钥的问题,我以前也遇到过这个问题。您会期望它按照您构建 NSDictionary 的顺序返回,但 NSDictionary 实际上没有顺序。我将更新我的答案以包含您可能想要考虑的其他解决方案。【参考方案3】:

构建一个完全通用的数据源的方法是这样的:

有一个最外层的sections NSMutableArray。 为每个部分插入一个 NSMutableDictionary。 在字典中为章节标题插入一个“title”(字符串)元素。 在字典中插入一个 NSMutableArray,键为“rows”。 为每一行创建一个 NSMutableDictionary 以包含该表行的实际数据(当然,并将其插入“rows”数组中)。

当然,您可以根据需要将其他元素添加到每个部分的字典中,如果您是那些对效率感到困惑的人之一,您可以将字典替换为专用对象。

对于单节表,请放弃 sections 数组和每节字典。

【讨论】:

以上是关于UITableView 部分顺序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ReloadData (UITableView) 不起作用

UITableView.appearance().separatorStyle 不起作用

UIRefreshControl 在 UITableView 中不起作用

顶部 UIScrollView 上的 UITableView 不起作用

用数组填充 UITableView 不起作用

UITableView 背景颜色 iPad 设备不起作用