iOS UITableView cellForRowAtIndexPath 未调用

Posted

技术标签:

【中文标题】iOS UITableView cellForRowAtIndexPath 未调用【英文标题】:iOS UITableView cellForRowAtIndexPath Not Calling 【发布时间】:2015-02-06 13:30:53 【问题描述】:

这是 UITableView numberOfRowsInSection 没有调用。但是 cellForRowAtIndexPath 没有被调用。我不明白为什么不调用 cellForRowAtIndexPath 。如果我重新调整部分中的行数

 return (allOfficedata.count >0)? allOfficedata.count + 1 : allOfficedata.count; 

return [array count]+1;  
 if (allOfficedata.count >0) return [allOfficedata count] + 1;

没有调用 cellforrowatindexpath,如果我给出返回数组计数;或返回 11;它工作正常,亲爱的,我附上了我的代码,错误

***** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayM objectAtIndex:]: index 10 beyond bounds [0 .. 9]”

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

    if (tableView==self.LeftMenuTable)
        return leftOptions.count;
    return [allOfficedata count]+1;


**********************************************************************
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    if (tableView==self.LeftMenuTable)
        return 60;

    Feedmodel *fmodel=[allOfficedata objectAtIndex:indexPath.row];
    NSString  *checkType =  fmodel.achievementType;
    if (isPad)
    
        if (indexPath.row == 0)
        
            return (isPad)?300.0:434.0;
        
        else if (indexPath.row == allOfficedata.count+1)
          return 30.0;
        else
        if (![checkType isEqualToString:@""] || [checkType isEqualToString:@"0"] || [checkType isEqualToString:@"1"])
            return ([fmodel.feedCommentCount integerValue] > 0)?366:318;
        else
            return  ([fmodel.feedCommentCount integerValue] > 0)?249:200;
        
        return 0.0;
    
    else
    
        if (indexPath.row == 0)
        
            return (isPad)?232.0:434.0;
        
        else
        
            if (![checkType isEqualToString:@""] || [checkType isEqualToString:@"0"] || [checkType isEqualToString:@"1"])
                return ([fmodel.feedCommentCount integerValue] )?259:222;
            else
                return  ([fmodel.feedCommentCount integerValue])?184:142;
        
        return 0.0;
    

***************************************************************
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *cellIdentifier3 = @"loadMore";
    static NSString *CellIdentifier = @"TableViewCell";

    if (tableView==self.LeftMenuTable)
    
        TableViewCell *cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)
        
            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
            cell = [topLevelObjects objectAtIndex:0];

            UIView *sepView=[[UIView alloc ]initWithFrame:CGRectMake(0,59, 250, 1)];
            [cell.contentView addSubview:sepView];
            [sepView setBackgroundColor:[UIColor grayColor]];
        

        cell.cellTextLabel.textColor=[UIColor whiteColor];
        [cell.cellTextLabel setText:[[leftOptions objectAtIndex:indexPath.row] valueForKey:@"name"]];
        [cell.CellImageView setImage:[UIImage imageNamed:[[leftOptions objectAtIndex:indexPath.row] valueForKey:@"image"]]];
        cell.selectionStyle=UITableViewCellSelectionStyleNone;
        cell.backgroundColor=[UIColor clearColor];

        return cell;
    
    else
    
        NSUInteger row = [indexPath row];
        NSInteger countRoe = [allOfficedata count];
          if (row == countRoe )
          


              UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier3];
              if (cell == nil) 
                  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier3];
              
              cell.textLabel.text = @"LoadMore";
              return cell;

          else
         
             if (indexPath.row == 0)
             
                 //CellCallOutBox_Onboarding_iPad
                 //CellCalloutbox_Office_iPad
                 //CellCalloutbox_Office_iPhone

                 NSString *nibName;
                 if ([calloutOffice.is_empty_daily_mission isEqualToString:@"false"]) 
                     nibName = (isPad)?@"CellCalloutbox_Office_iPad":@"CellCalloutbox_Office_iPhone";

                 
                 else if ([calloutOffice.is_empty_onboarding_mission isEqualToString:@"false"])
                 
                     nibName = (isPad)?@"CellCallOutBox_Onboarding_iPad":@"CellCallOutBox_Onboarding_iPhone";
                 
                 else if ([calloutOffice.is_empty_community_mission isEqualToString:@"false"])
                 
                     nibName = (isPad)?@"CellCallOutBox_Onboarding_iPad":@"CellCallOutBox_Onboarding_iPhone";
                 

                 CellCalloutbox_Office *cellcallout = (CellCalloutbox_Office *)[tableView dequeueReusableCellWithIdentifier:nibName];

                 if (cellcallout == nil)
                 
                     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil];
                     cellcallout = [nib objectAtIndex:0];
                 
                 cellcallout.aMissionDelegate = self;
                 [cellcallout.btnVideoOfTheDay addTarget:self action:@selector(videoOfTheDay) forControlEvents:UIControlEventTouchUpInside];
                 cellcallout.backgroundColor=[UIColor clearColor];
                 [cellcallout setArraywithCallOut:calloutOffice expanded:isCallOutOfficeExpanded];
                 [cellcallout.btnBackCallout addTarget:self action:@selector(calloutBack) forControlEvents:UIControlEventTouchUpInside];
                 [cellcallout.btnDailyMission addTarget:self action:@selector(openCalloutDilyMission) forControlEvents:UIControlEventTouchUpInside];

                 return cellcallout;
             


             Feedmodel *fmodel=[allOfficedata objectAtIndex:indexPath.row];
             NSString  *checkType =  fmodel.achievementType;

             if (![checkType isEqualToString:@""] || [checkType isEqualToString:@"0"] || [checkType isEqualToString:@"1"])

             
                 static NSString *simpleTableIdentifier = @"CellWithImageVideo";

                 CellWithImageVideo *cell = (CellWithImageVideo *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
                 NSString *nibNmaeForiPad = (([fmodel.feedCommentCount integerValue])?@"CellWithImage_Comment_iPad":@"Cell_WithImage_MyOffice_iPad");
                 NSString *nibNmaeForiPhone = (([fmodel.feedCommentCount integerValue])?@"CellWithImagewithComment_iPhone":@"CellWithImageVideo");
                 if (cell == nil)
                 
                     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:(isPad)?nibNmaeForiPad:nibNmaeForiPhone owner:self options:nil];
                     cell = [nib objectAtIndex:0];
                 
                 cell.backgroundColor=[UIColor clearColor];
                 cell.contentView.backgroundColor=[UIColor clearColor];
                 [cell setFeeddata:fmodel indexPath:indexPath];


                 [cell.hifiveBtn         addTarget:self action:@selector(hifiveClickedMyOfiice:) forControlEvents:UIControlEventTouchUpInside];
                 [cell.playMintBtn       addTarget:self action:@selector(getFeedDetails:) forControlEvents:UIControlEventTouchUpInside];
                 [cell.planToDoBtn       addTarget:self action:@selector(planToDoClickedOffice:) forControlEvents:UIControlEventTouchUpInside];
                 [cell.userImageBtn      addTarget:self action:@selector(gotouserProfile:) forControlEvents:UIControlEventTouchUpInside];
                 [cell.inspireBtn        addTarget:self action:@selector(InspireClicked:) forControlEvents:UIControlEventTouchUpInside];
                 [cell.sendCommentBtn    addTarget:self action:@selector(serverCommentPost:) forControlEvents:UIControlEventTouchUpInside];
                 [cell.btnCompliment     addTarget:self action:@selector(getFeedCommentPopup:) forControlEvents:UIControlEventTouchUpInside];

                 cell.txtFldCommentField.delegate  = self;
                 return  cell;
             
             else
             
                 static NSString *simpleTableIdentifier = @"CellWithoutImage";
                 NSString *nibNmaeForiPad = (([fmodel.feedCommentCount integerValue])?@"Cell_withoutImage_withcomment_iPad":@"Cell_withoutImage_Ipad_Office");
                 NSString *nibNmaeForiPhone = (([fmodel.feedCommentCount integerValue])?@"CellWithoutImagewithComment_iPhone":@"CellWithoutImage");


                 CellWithoutImage *cell = (CellWithoutImage *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
                 if (cell == nil)
                 
                     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:(isPad)?nibNmaeForiPad:nibNmaeForiPhone owner:self options:nil];
                     cell = [nib objectAtIndex:0];
                 
                 [cell setFeeddata:fmodel indexPath:indexPath];
                 cell.backgroundColor=[UIColor clearColor];
                 cell.contentView.backgroundColor=[UIColor clearColor];



                 [cell.hifiveBtn         addTarget:self action:@selector(hifiveClickedMyOfiice:)           forControlEvents:UIControlEventTouchUpInside];
                 [cell.planToDoBtn       addTarget:self action:@selector(planToDoClickedOffice:)           forControlEvents:UIControlEventTouchUpInside];
                 [cell.userImageBtn      addTarget:self action:@selector(gotouserProfile:)                 forControlEvents:UIControlEventTouchUpInside];
                 [cell.inspireBtn        addTarget:self action:@selector(InspireClicked:)                  forControlEvents:UIControlEventTouchUpInside];
                 [cell.btnCompliment     addTarget:self action:@selector(getFeedCommentPopup:)                   forControlEvents:UIControlEventTouchUpInside];
                 [cell.sendCommentBtn     addTarget:self action:@selector(serverCommentPost:)               forControlEvents:UIControlEventTouchUpInside];
                 [cell.btnTextMintTapped    addTarget:self action:@selector(getFeedDetails:)               forControlEvents:UIControlEventTouchUpInside];

                 cell.txtFldComment.delegate = self;
                 return cell;
             
         
    

【问题讨论】:

检查numberOfRowsInSection返回的值。 我正在返回 return [allOfficedata count]+1;同样的问题 我不知道[allOfficedata count]+1的值是多少,我怎么知道? 你能解释一下你要做什么吗? allOfficedata 它是一个数组,考试:[数组计数]+1; Array.count+1; 【参考方案1】:

所以你说 allOfficedata + 1 for numberOfRowsInSection 但在 heightForRowAtIndexPath: 你有以下行:

 Feedmodel *fmodel=[allOfficedata objectAtIndex:indexPath.row];

这会导致你在最后一个单元格上崩溃,所以你想检查它是否是最后一个单元格,如果它是做其他事情。

编辑:

除了你似乎在 cellForIndexPath 中做类似的事情,

如果 (indexPath == 0) 你做了一些事情,但之后你得到的下一个单元格:

 Feedmodel *fmodel=[allOfficedata objectAtIndex:indexPath.row];

您应该 - 来自 indexPath.row 的 1,因为目前您在单元格处获得,比如说 indexPath.row == 1,您在索引 1 处请求对象,我认为您应该请求 0。AS当您到达最后一个单元格时,该应用程序将在上述行崩溃。

编辑 2:

所以问题是您向 allOfficedata 询问不存在的索引,当您对行说 allOfficedata+1 时,当它到达表中最后一个单元格的 heightForRowAtIndexPath 时,它会从 allOfficedata 中询问数据不存在的索引,因为它正在寻找您在 numberOfRowsInSection 中给出的 +1

假设 allOfficedata 的计数是 10(索引 0-9),我们已经说过表中的行数是 allOfficedata+1,所以它是 11(索引 0-10)。

现在在 heightForRowAtIndexPath 中,我们到达最后一个单元格(索引 10),allOfficedata 没有它,因为它的索引是 0-9。你向 allOfficedata 询问索引 10 它会崩溃。

【讨论】:

它没有调用 cellforrowatindexpath。 我尝试了更多示例。它不会到达 cellAtIndexPath,因为它会在那之前在 heightForRowAtIndexPath 处崩溃。【参考方案2】:

NSArray 越界..

数组 0 到 9 中的 10 个值 [not 1 到 10] 在表索引也是 相同的 0 到 9 [not 1 到 10]

所以indexpath.row 将为您提供正确的值,以便从正确位置的数组中确定值

【讨论】:

我检查了这个东西。当我在那里返回值时,它会出现错误。如果我手动返回 11 意味着它的工作,如果我这样返回意味着返回 NSArray.count+1;意味着 ist 显示该错误。 ende issue fix cheyyan help me【参考方案3】:

除了行数错误之外,从未调用 cellForRowAtIndexPath 的最可能原因是表视图认为没有要显示的行。

cellForRowAtIndexPath 只会在需要一个单元格时被调用。您似乎有非常高的单元格在查看您的代码。看不到任何节标题视图或高度的代码。

因此,考虑到高度很大,尤其是对于第 0 行(根据您的代码为 300 或 400),除非您向上滚动,否则不会有很多调用此函数。当您滚动时,您应该会看到更多对单元格的调用。

还要检查您是否为高度返回 0,因为这也可能会阻止它尝试显示我认为不会被看到的单元格。

它将询问每行的高度以估计所需的滚动条大小。

【讨论】:

以上是关于iOS UITableView cellForRowAtIndexPath 未调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 UITapGestureRecognizer 检测 UITableViewCell 中 UILabel 的点击事件

Tableview 单元格可重用性,切割标签文本

IOS-UITableView入门

iOS 编辑UITableView(根据iOS编程编写)

iOS小技能:1. 什么是UITableView? 2. UITableView如何展示数据

iOS开发之UITableView的使用