我正在尝试将节标题添加到我的UITableView中。我能够正确地创建各个部分并计算每个部分中的元素数量,但是当我调用我的cellForRowAtIndexPath方法时,该表会重复两个部分中的数据。
这是我准备UITableView部分内容的地方:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
int sections = 0;
if (sectionOneCount>0) {
sections++;
}
if (sectionTwoCount>0) {
sections++;
}
return sections;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (section==0) {
return sectionOneCount;
}
else {
return sectionTwoCount;
}
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
if(section == 0) {
return @"Section One Title";
}
else {
return @"Section Two Title";
}
}
这是我的cellForRowAtIndexPath方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"MainCell";
ProfileTableViewCell *cell = [mainTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[ProfileTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.label1.text = [[items objectAtIndex:indexPath.row] valueForKey:@"label1"];
cell.label2.text = [[items objectAtIndex:indexPath.row] valueForKey:@"label2"];
return cell;
}
关于我在这里做错了什么的想法?谢谢!
P.S。以下是我正在使用的一些示例数据。我只有两个可能的部分,每种类型一个(在这种情况下,红色和蓝色)。我有一个名为items的主数组(正如你在我的cellForRowAtIndexPath方法中看到的那样)。
{
"parentArray": {
"id": 5,
"items": [
{
"type": "red",
"title": "RedItem1"
},
{
"type": "red",
"title": "RedItem2"
},
{
"type": "blue",
"title": "BlueItem1"
},
{
"type": "blue",
"title": "BlueItem2"
},
{
"type": "blue",
"title": "BlueItem3"
}
]
}
}
答案 0 :(得分:4)
继续使用您的逻辑...
假设您的sectionOneCount
和sectionTwoCount
正确并且顺序正确,您可以使用sectionOneCount
作为填充第2部分内容的偏移量。
示例:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MainCell";
ProfileTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(indexPath.section == 0) {
cell.label1.text = items[indexPath.row][@"label1"];
cell.label2.text = items[indexPath.row][@"label2"];
}
else if (indexPath.section == 1) {
cell.label1.text = items[indexPath.row + sectionOneCount][@"label1"];
cell.label2.text = items[indexPath.row + sectionOneCount][@"label2"];
}
return cell;
}
PS:使用情节提要时,您不需要if (cell == nil)
块
假设您的items
看起来像
{
"items": [// array of sections
[//array of section 1 items
{
"type": "red",
"title": "redItem1"
},
{
"type": "red",
"title": "redItem2"
}
],
[// array of section 2 items
{
"type": "blue",
"title": "blueItem1"
},
{
"type": "blue",
"title": "blueItem2"
},
{
"type": "blue",
"title": "blueItem3"
}
]
]
}
基本上:
{
"items": [//array of 2 things
[ /*array of all redItems*/ ],
[ /*array of all blueItems*/ ]
]
}
这将是:
greenItems
数组和更多sectionCount
变量的任何依赖而且......你的主要代表方法就是:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return items.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [items[section]].count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MainCell";
UITableView *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//no need for if-else anymore as the following is dynamic enough
cell.label1.text = items[indexPath.section][indexPath.row][@"label1"];
cell.label2.text = items[indexPath.section][indexPath.row][@"label2"];
return cell;
}
PS:即使您使用更多部分更新数据源,也不需要触及此代码。