Apple のドキュメントでは、cellForRowAtIndexPath が順番に実行されることを指定していないことを知っています。つまり、最初にセクション 0、インデックス 0 に移動します。次に、セクション 0、インデックス 2。そして、セクション 1、インデックス 0....など。飛び跳ねると思います。
以下を達成するためのより良い方法は何ですか? 現在、エラーが発生し続けています
NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2]'
エラーが表示されます b/c cellForRowAtIndexPath がジャンプしてマークを付けると思う
*sectioned = NULL
ので、条件がスキップされて空の配列になるか、間違った条件に移動してインデックス数を超えます。
コードは次のとおりです。
... declared and synthesized
NSManaged *object;
@property (strong, nonatomic) NSNumber *sevenDaysSectionFilled;
@property (strong, nonatomic) NSNumber *fourteenDaysSectionFilled;
@property (strong, nonatomic) NSNumber *thirtyDaysSectionFilled;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
object = NULL;
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (indexPath.section == 0)
{
if ((SevenDaysArraySectioned == [NSNumber numberWithBool:YES]) && (sevenDaysSectionFilled != [NSNumber numberWithBool:YES]))
{
object = [pastSevenDayArray objectAtIndex:indexPath.row];
sevenDaysSectionFilled = [NSNumber numberWithBool:YES];
}
else if ((fourteenDaysArraySectioned == [NSNumber numberWithBool:YES]) && (fourteenDaysSectionFilled != [NSNumber numberWithBool:YES]))
{
object = [pastFourteenDaysArray objectAtIndex:indexPath.row];
fourteenDaysSectionFilled = [NSNumber numberWithBool:YES];
}
else if ((thirtyDaysArraySectioned == [NSNumber numberWithBool:YES]) && (thirtyDaysSectionFilled != [NSNumber numberWithBool:YES]))
{
object = [pastThirtyDaysArray objectAtIndex:indexPath.row];
thirtyDaysSectionFilled = [NSNumber numberWithBool:YES];
}
else if (indexPath.section == 1)
{
if ((fourteenDaysArraySectioned == [NSNumber numberWithBool:YES]) && (fourteenDaysSectionFilled != [NSNumber numberWithBool:YES]))
{
object = [pastFourteenDaysArray objectAtIndex:indexPath.row];
fourteenDaysSectionFilled = [NSNumber numberWithBool:YES];
}
else if ((thirtyDaysArraySectioned == [NSNumber numberWithBool:YES]) && (thirtyDaysSectionFilled != [NSNumber numberWithBool:YES]))
{
object = [pastThirtyDaysArray objectAtIndex:indexPath.row];
thirtyDaysSectionFilled = [NSNumber numberWithBool:YES];
}
else if (indexPath.section == 2)
{
if ((thirtyDaysArraySectioned == [NSNumber numberWithBool:YES]) && (thirtyDaysSectionFilled != [NSNumber numberWithBool:YES]))
{
object = [pastThirtyDaysArray objectAtIndex:indexPath.row];
thirtyDaysSectionFilled = [NSNumber numberWithBool:YES];
}
}
NSString *entityName = [[object entity]name];
cell.textLabel.text = [NSString stringWithFormat:@"%@ %i", entityName, [indexPath row]];
object = NULL;
return cell;
}
これを達成するためのより良い方法があれば教えてください。ありがとう。
*編集
これは少し複雑ですが、次のとおりです。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
numberOfSections = 0;
if ([pastSevenDayArray count] > 0) numberOfSections++;
if ([pastFourteenDaysArray count] > 0) numberOfSections++;
if ([pastThirtyDaysArray count] > 0) numberOfSections++;
if ([pastSixtyDaysArray count] > 0) numberOfSections++;
if ([pastNinteyDaysArray count] > 0) numberOfSections++;
if ([pastArray count] > 0) numberOfSections++;
[self numberOfCells];
return numberOfSections;
}
セル数
-(void)numberOfCells
{
for (int section = 0; section<numberOfSections; section ++)
{
if (section == 0)
{
if ([pastSevenDayArray count] > 0)
{
SevenDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionZeroCellCount = [pastSevenDayArray count];
sectionZeroHeader = sevenDaysSectionLabel;
}
else if ([pastFourteenDaysArray count] > 0)
{
fourteenDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionZeroCellCount = [pastFourteenDaysArray count];
sectionZeroHeader = fourteenDaysSectionLabel;
}
else if ([pastThirtyDaysArray count] > 0)
{
thirtyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionZeroCellCount = [pastThirtyDaysArray count];
sectionZeroHeader = thirtyDaysSectionLabel;
}
else if ([pastSixtyDaysArray count] > 0)
{
sixtyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionZeroCellCount = [pastSixtyDaysArray count];
sectionZeroHeader = sixtyDaysSectionLabel;
}
else if ([pastNinteyDaysArray count] > 0)
{
ninetyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionZeroCellCount = [pastNinteyDaysArray count];
sectionZeroHeader = ninetyDaysSectionLabel;
}
else if ([pastArray count] > 0)
{
pastArraySectioned = [NSNumber numberWithBool:YES];
sectionZeroCellCount = [pastArray count];
sectionZeroHeader = pastSectionLabel;
}
}
else if (section == 1)
{
if (([pastFourteenDaysArray count] > 0) && (fourteenDaysArraySectioned != [NSNumber numberWithBool:YES]))
{
fourteenDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionOneCellCount = [pastFourteenDaysArray count];
sectionOneHeader = fourteenDaysSectionLabel;
}
else if (([pastThirtyDaysArray count] > 0) && (thirtyDaysArraySectioned != [NSNumber numberWithBool:YES]))
{
thirtyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionOneCellCount = [pastThirtyDaysArray count];
sectionOneHeader = thirtyDaysSectionLabel;
}
else if (([pastSixtyDaysArray count] > 0) && (sixtyDaysArraySectioned != [NSNumber numberWithBool:YES]))
{
sixtyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionOneCellCount = [pastSixtyDaysArray count];
sectionOneHeader = sixtyDaysSectionLabel;
}
else if (([pastNinteyDaysArray count] > 0) && (ninetyDaysArraySectioned != [NSNumber numberWithBool:YES]))
{
ninetyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionOneCellCount = [pastNinteyDaysArray count];
sectionOneHeader = ninetyDaysSectionLabel;
}
else if (([pastArray count] > 0) && (pastArraySectioned != [NSNumber numberWithBool:YES]))
{
pastArraySectioned = [NSNumber numberWithBool:YES];
sectionOneCellCount = [pastArray count];
sectionOneHeader = pastSectionLabel;
}
}
else if (section ==2)
{
if (([pastThirtyDaysArray count] > 0) && (thirtyDaysArraySectioned != [NSNumber numberWithBool:YES]))
{
thirtyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionTwoCellCount = [pastThirtyDaysArray count];
sectionTwoHeader = thirtyDaysSectionLabel;
}
else if (([pastSixtyDaysArray count] > 0) && (sixtyDaysArraySectioned != [NSNumber numberWithBool:YES]))
{
sixtyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionTwoCellCount = [pastSixtyDaysArray count];
sectionTwoHeader = sixtyDaysSectionLabel;
}
else if (([pastNinteyDaysArray count] > 0) && (ninetyDaysArraySectioned != [NSNumber numberWithBool:YES]))
{
ninetyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionTwoCellCount = [pastNinteyDaysArray count];
sectionTwoHeader = ninetyDaysSectionLabel;
}
else if (([pastArray count] > 0) && (pastArraySectioned != [NSNumber numberWithBool:YES]))
{
pastArraySectioned = [NSNumber numberWithBool:YES];
sectionTwoCellCount = [pastArray count];
sectionTwoHeader = pastSectionLabel;
}
}
else if (section ==3)
{
NSLog(@"Entered Section %i", section);
if (([pastSixtyDaysArray count] > 0) && (sixtyDaysArraySectioned != [NSNumber numberWithBool:YES])) {
sixtyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionThreeCellCount = [pastSixtyDaysArray count];
sectionThreeHeader = sixtyDaysSectionLabel;
}
else if (([pastNinteyDaysArray count] > 0) && (ninetyDaysArraySectioned != [NSNumber numberWithBool:YES]))
{
ninetyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionThreeCellCount = [pastNinteyDaysArray count];
sectionThreeHeader = ninetyDaysSectionLabel;
}
else if (([pastArray count] > 0) && (pastArraySectioned != [NSNumber numberWithBool:YES]))
{
pastArraySectioned = [NSNumber numberWithBool:YES];
sectionThreeCellCount = [pastArray count];
sectionThreeHeader = pastSectionLabel;
}
}
else if (section ==4)
{
NSLog(@"Entered Section %i", section);
if (([pastNinteyDaysArray count] > 0) && (ninetyDaysArraySectioned != [NSNumber numberWithBool:YES]))
{
ninetyDaysArraySectioned = [NSNumber numberWithBool:YES];
sectionFourCellCount = [pastNinteyDaysArray count];
sectionFourHeader = ninetyDaysSectionLabel;
}
else if (([pastArray count] > 0) && (pastArraySectioned != [NSNumber numberWithBool:YES]))
{
pastArraySectioned = [NSNumber numberWithBool:YES];
sectionFourCellCount = [pastArray count];
sectionFourHeader = pastSectionLabel;
}
}
else if (section ==5)
{
NSLog(@"Entered Section %i", section);
if (([pastArray count] > 0) && (pastArraySectioned != [NSNumber numberWithBool:YES]))
{
pastArraySectioned = [NSNumber numberWithBool:YES];
sectionFiveCellCount = [pastArray count];
sectionFiveHeader = pastSectionLabel;
}
}
}
}
numberOfRowsInSection
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == 0)
{
return sectionZeroCellCount;
}
else if (section == 1)
{
return sectionOneCellCount;
}
else if (section == 2)
{
return sectionTwoCellCount;
}
else if (section == 3)
{
return sectionThreeCellCount;
}
else if (section == 4)
{
return sectionFourCellCount;
}
if (section == 5)
{
return sectionFiveCellCount;
}
}
編集2
ヘッダ:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 30.0;
}
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 150)];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 3, tableView.bounds.size.width - 10, 25)];
label.backgroundColor = [UIColor clearColor];
[label setFont:[UIFont boldSystemFontOfSize:16]];
label.textColor = [UIColor whiteColor];
if (section == 0)
{
label.text = sectionZeroHeader;
}
else if (section == 1)
{
label.text = sectionOneHeader;
}
else if (section == 2)
{
label.text = sectionTwoHeader;
}
else if (section == 3)
{
label.text = sectionThreeHeader;
}
else if (section == 4)
{
label.text = sectionFourHeader;
}
else if (section == 5)
{
label.text = sectionFiveHeader;
}
[headerView addSubview:label];
return headerView;
}