![](/img/trans.png)
[英]What is the meaning of the “no index path for table cell being reused” message in iOS 6/7?
[英]before executing UItableView delegate/datasource method “no index path for table cell being reused before” message is displayed in console
我正在開發一個使用UITableView的應用程序,該程序以編程方式添加以如下方式進行查看,
//creating tableview1
tableView1=[[UITableView alloc]initWithFrame:CGRectMake(self.view.frame.origin.x,self.view.frame.origin.y,self.view.frame.size.width,heightOfTable1)];
tableView1.scrollEnabled=NO;
tableView1.dataSource=self;
tableView1.separatorStyle=UITableViewCellSeparatorStyleNone;
[self.view addSubview:tableView1];
以下是我的cellForRowAtIndexPath方法
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier=@"CustomHiddenViewCell";
CustomHiddenViewCell *cell = (CustomHiddenViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomHiddenViewCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
cell.greetingLabel.hidden=YES;
cell.detailViewButton.hidden=YES;
cell.separatorView.hidden=YES;
cell.accessoryType=UITableViewCellAccessoryNone;
if (tableView==tableView1) {
[[cell viewWithTag:101] removeFromSuperview];
[[cell viewWithTag:102] removeFromSuperview];
[[cell viewWithTag:103] removeFromSuperview];
[[cell viewWithTag:104] removeFromSuperview];
[[cell viewWithTag:105] removeFromSuperview];
[[cell viewWithTag:106] removeFromSuperview];
[[cell viewWithTag:107] removeFromSuperview];
[[cell viewWithTag:108] removeFromSuperview];
[[cell viewWithTag:109] removeFromSuperview];
if (initialViewFlag==1) {
if (indexPath.row==0) {
UIImageView *logoImageView=[[UIImageView alloc]initWithFrame:CGRectMake(cell.frame.size.width/2-60, 5, 120,50)];
logoImageView.image=[self convertImage];
[logoImageView setTag:101];
[cell.contentView addSubview:logoImageView];
[cell.contentView bringSubviewToFront:logoImageView];
}
else if (indexPath.row==1) {
[cell.detailViewButton addTarget:self action:@selector(exploreViewButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
UIButton *backButton=[[UIButton alloc]initWithFrame:CGRectMake(cell.frame.origin.x+20,10,70,40)];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
[backButton setTag:102];
[backButton setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:backButton];
[cell bringSubviewToFront:backButton];
UIButton *homeButton=[[UIButton alloc]initWithFrame:CGRectMake(cell.detailViewButton.frame.origin.x+cell.detailViewButton.frame.size.width+58,10,70,40)];
[homeButton setTitle:@"Home" forState:UIControlStateNormal];
[homeButton setTag:103];
[homeButton setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:homeButton];
[cell bringSubviewToFront:homeButton];
}
else if (indexPath.row==2){
UILabel *cellLabel=[[UILabel alloc]initWithFrame:CGRectMake(10,0,cell.frame.size.width,cell.frame.size.height/2)];
[cellLabel setText:@"Personal Details"];
[cellLabel setTag:104];
[cell.contentView addSubview:cellLabel];
}
}
else if(initialViewFlag==2){
if (indexPath.row==0) {
UIImageView *logoImageView=[[UIImageView alloc]initWithFrame:CGRectMake(cell.frame.size.width/2-60, 5,120,50)];
logoImageView.image=[self convertImage];
[logoImageView setTag:201];
[cell.contentView addSubview:logoImageView];
}
else if (indexPath.row==1) {
cell.greetingLabel.hidden=YES;
cell.detailViewButton.hidden=YES;
UIButton *phoneButton=[[UIButton alloc]initWithFrame:CGRectMake(cell.frame.origin.x+5,cell.frame.origin.y+2,70,cell.frame.size.height-4)];
[phoneButton setTitle:@"Phone" forState:UIControlStateNormal];
[phoneButton setTag:202];
[cell.contentView addSubview:phoneButton];
UIButton *emailButton=[[UIButton alloc]initWithFrame:CGRectMake(phoneButton.frame.origin.x+phoneButton.frame.size.width+10,cell.frame.origin.y+2,70,cell.frame.size.height-4)];
[emailButton setTitle:@"Email" forState:UIControlStateNormal];
[emailButton setTag:203];
[cell.contentView addSubview:emailButton];
[cell bringSubviewToFront:emailButton];
UIButton *aboutInfoButton=[[UIButton alloc]initWithFrame:CGRectMake(emailButton.frame.origin.x+emailButton.frame.size.width+10,cell.frame.origin.y+2,70,cell.frame.size.height-4)];
[aboutInfoButton setTitle:@"About" forState:UIControlStateNormal];
[aboutInfoButton setTag:204];
[cell.contentView addSubview:aboutInfoButton];
[cell bringSubviewToFront:aboutInfoButton];
UIButton *logoutButton=[[UIButton alloc]initWithFrame:CGRectMake(aboutInfoButton.frame.origin.x+aboutInfoButton.frame.size.width+10,cell.frame.origin.y+2,70,cell.frame.size.height-4)];
[logoutButton setTitle:@"Logout" forState:UIControlStateNormal];
[logoutButton setTag:205];
[cell.contentView addSubview:logoutButton];
[cell bringSubviewToFront:logoutButton];
}
else if (indexPath.row==2) {
cell.detailViewButton.hidden=NO;
[cell.detailViewButton addTarget:self action:@selector(exploreViewButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
}
else if (indexPath.row==3) {
cell.detailViewButton.hidden =NO;
[cell.detailViewButton addTarget:self action:@selector(exploreViewButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
UIButton *backButton=[[UIButton alloc]initWithFrame:CGRectMake(cell.frame.origin.x+20,10,70,40)];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
[backButton setTag:206];
[cell.contentView addSubview:backButton];
[cell bringSubviewToFront:backButton];
UIButton *homeButton=[[UIButton alloc]initWithFrame:CGRectMake(cell.detailViewButton.frame.origin.x+cell.detailViewButton.frame.size.width+58,10,70,40)];
[homeButton setTitle:@"Home" forState:UIControlStateNormal];
[homeButton setTag:207];
[homeButton setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:homeButton];
[cell bringSubviewToFront:homeButton];
}
else if (indexPath.row==4){
UILabel *cellLabel=[[UILabel alloc]initWithFrame:CGRectMake(10,0,cell.frame.size.width/2,cell.frame.size.height/2)];
[cellLabel setText:@"Personal Details"];
[cellLabel setTag:208];
cellLabel.backgroundColor=[UIColor clearColor];
[cell.contentView addSubview:cellLabel];
[cell bringSubviewToFront:cellLabel];
}
}
else if (initialViewFlag==3){
if (indexPath.row==0) {
cell.detailViewButton.hidden =NO;
[cell.detailViewButton addTarget:self action:@selector(exploreViewButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
UIButton *backButton=[[UIButton alloc]initWithFrame:CGRectMake(cell.frame.origin.x+20,10,70,40)];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
[backButton setTag:301];
[backButton setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:backButton];
[cell bringSubviewToFront:backButton];
UIButton *homeButton=[[UIButton alloc]initWithFrame:CGRectMake(cell.detailViewButton.frame.origin.x+cell.detailViewButton.frame.size.width+58,10,70,40)];
[homeButton setTitle:@"Home" forState:UIControlStateNormal];
[homeButton setTag:302];
[homeButton setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:homeButton];
[cell bringSubviewToFront:homeButton];
}
else if (indexPath.row==1){
UILabel *cellLabel=[[UILabel alloc]initWithFrame:CGRectMake(10,0,cell.frame.size.width/2,cell.frame.size.height/2)];
[cellLabel setText:@"Personal Details"];
[cellLabel setTag:303];
cellLabel.backgroundColor=[UIColor clearColor];
[cell.contentView addSubview:cellLabel];
[cell bringSubviewToFront:cellLabel];
}
}
}
return cell;
}
//numberOfSectionsInTableView method
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (tableView==accountStatementUpperTableView) {
if (initialViewFlag==1) {
return 3;
}
else if(initialViewFlag==2){
return 5;
}
else if (initialViewFlag==3){
return 2;
}
}
return 0;
}
//heightForRowAtIndexPath method
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier=@"CustomHiddenViewCell";
CustomHiddenViewCell *cell = (CustomHiddenViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomHiddenViewCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
if (tableView==accountStatementUpperTableView) {
[accountStatementUpperTableView beginUpdates];
[accountStatementUpperTableView endUpdates];
if (initialViewFlag==1) {
if (indexPath.row==0 || indexPath.row==1) {
return cell.frame.size.height;
}
else if (indexPath.row==2){
return cell.frame.size.height/2;
}
}
else if (initialViewFlag==2) {
if (indexPath.row==0 || indexPath.row==1 || indexPath.row==3) {
return cell.frame.size.height;
}
else if(indexPath.row==2){
return cell.detailViewButton.frame.size.height;
}
else if(indexPath.row==4){
double heightOfCell=(cell.frame.size.height/2);
return heightOfCell;
}
}
else if (initialViewFlag==3){
if (indexPath.row==0) {
return cell.frame.size.height;
}
else if (indexPath.row==1){
return cell.frame.size.height/2;
}
}
}
return cell.frame.size.height;
}
#pragma mark -
當我運行我的應用程序時,它在控制台中顯示“之前沒有重用表單元的索引路徑”消息。 當我嘗試使用調試器運行它時,我發現該消息首先顯示,然后開始執行UItableView的委托和數據源方法。
在刪除所有重新加載,開始更新和結束更新語句之后,我也嘗試運行,但是仍然收到此消息。 並且此消息在重新加載或更新語句期間不顯示,僅在加載之前顯示
誰能告訴我為什么會這樣? 我的代碼有什么問題嗎? 任何幫助表示贊賞。
得到了解決方案。 我收到此消息只是因為我在呈現另一個視圖控制器時在較早的視圖控制器的presentViewController的完成塊中重新加載了tableview。
通過從presentViewController的完成塊中刪除重載語句解決了此問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.