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 部分顺序不起作用的主要内容,如果未能解决你的问题,请参考以下文章
UITableView.appearance().separatorStyle 不起作用
UIRefreshControl 在 UITableView 中不起作用