tableView - иногда с ошибкой, иногда без - пытается загрузить метку в последней ячейке
Я пытаюсь реализовать метод load more для моей последней ячейки. После экспериментов я наконец смог добавить нагрузку (пока без функции) в свою ячейку. Но это кажется немного сложнее, потому что я загружаю свой контент из XML.
Вот что я делаю:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if([tabelle count]>= 10)
{
return [tabelle count]+1;
}
else
{
return [tabelle count];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; }
if(indexPath.row != [tabelle count] )
{
cell.textLabel.font = [UIFont fontWithName:@"Arial-Bold" size:14.0];
cell.detailTextLabel.font = [UIFont fontWithName:@"Arial" size:12.0];
self.tableView.separatorColor = [UIColor clearColor];
NSString *TableText = [[NSString alloc] initWithFormat:@"%@", [[tabelle objectAtIndex:indexPath.row] number1]];
NSString *TableText2 = [[NSString alloc] initWithFormat:@"%@", [[tabelle objectAtIndex:indexPath.row] number2]];
NSString *cellValue = [NSString stringWithFormat:@"%@", TableText2];
NSString *cellValue2 = [NSString stringWithFormat:@"%@", TableText];
cell.textLabel.text = cellValue;
cell.detailTextLabel.textColor = [UIColor colorWithRed:51.0f/255.0f green:102.0f/255.0f blue:220.0f/255.0f alpha:1.0f];
cell.detailTextLabel.text = cellValue2;
}
else if(indexPath.row==[tabelle count])
{
UILabel *loadMore =[[UILabel alloc]initWithFrame: CGRectMake(0,0,320,30)];
loadMore.textColor = [UIColor blackColor];
loadMore.backgroundColor = [UIColor clearColor];
loadMore.font=[UIFont fontWithName:@"Verdana" size:20];
loadMore.textAlignment=UITextAlignmentCenter;
loadMore.font=[UIFont boldSystemFontOfSize:20];
loadMore.text=@"Gimme more!";
[cell addSubview:loadMore];
}
return cell;
}
Ячейка load more (которая читает Gimme more!) Выскакивает в последнюю ячейку (но не создает новую последнюю ячейку, только в обычной последней ячейке, следовательно, мешает ее содержимому), а также случайно появляется в табличном представлении.
Первая проблема заключалась в том, что этот метод сам себя укусил, поэтому мне пришлось немного его изменить, в противном случае я получаю ошибку ниже:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == [tabelle count]) {
} else {
NSString *text = [[self.tabelle objectAtIndex:indexPath.row] number1];
CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 7, 1000.0f)];
return textSize.height + PADDING * 7;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
{
if(indexPath.row==[tabelle count])
{
[self.tableView cellForRowAtIndexPath:indexPath];
}
}
} И вот ошибка, которую я имел (и иногда все еще имею при прокрутке представления):
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 11 beyond bounds [0 .. 10]'
1 ответ
Кажется, есть некоторые странности с кодом, который вы разместили. В первом фрагменте оператор if кажется сам по себе (без инкапсулирующего метода?). В heightForRowAtIndexPath вы не возвращаете значение из секции then оператора if.
[РЕДАКТИРОВАТЬ] Вот как я бы написал то, что вы опубликовали до сих пор:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// I am not the below make sense but that depends on what you are intending
// I do have a feeling there is a "off by one" issue here
if ([tabelle count] >= 10) {
return [tabelle count]+1;
}else{
return [tabelle count];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell;
if (indexPath.row != [tabelle count] ) {
cell = [tableView dequeueReusableCellWithIdentifier:@"Cell1"];
if (cell == nil) {
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell1"]; }
cell.textLabel.font = [UIFont fontWithName:@"Arial-Bold" size:14.0];
cell.detailTextLabel.font = [UIFont fontWithName:@"Arial" size:12.0];
cell.detailTextLabel.textColor = [UIColor colorWithRed:51.0f/255.0f green:102.0f/255.0f blue:220.0f/255.0f alpha:1.0f];
self.tableView.separatorColor = [UIColor clearColor];
}
NSString *TableText = [[NSString alloc] initWithFormat:@"%@", [[tabelle objectAtIndex:indexPath.row] number1]];
NSString *TableText2 = [[NSString alloc] initWithFormat:@"%@", [[tabelle objectAtIndex:indexPath.row] number2]];
cell.textLabel.text = TableText;
cell.detailTextLabel.text = TableText2;
}else{
cell = [tableView dequeueReusableCellWithIdentifier:@"Cell2"];
if (cell == nil) {
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell2"]; }
UILabel *loadMore = [[UILabel alloc] initWithFrame: CGRectMake(0,0,320,30)];
loadMore.textColor = [UIColor blackColor];
loadMore.backgroundColor = [UIColor clearColor];
loadMore.textAlignment = UITextAlignmentCenter;
loadMore.font = [UIFont boldSystemFontOfSize:20];
loadMore.text = @"Gimme more!";
[cell addSubview:loadMore];
}
}
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == [tabelle count]) {
return 44.0;
}else{
NSString *text = [[self.tabelle objectAtIndex:indexPath.row] number1];
CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 7, 1000.0f)];
return textSize.height + PADDING * 7;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (indexPath.row == [tabelle count]) {
// TO-DO: user tapped 'Giimie more'
}else{
// TO-DO: user tapped a regular cell
}
}