Перезагрузите данные UITableView в ячейке вне поля зрения

#ios #iphone #uitableview #cocoa-touch #reload

#iOS #iPhone #uitableview #cocoa-touch #перезагрузите

Вопрос:

 [self.countryList reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[NSIndexPath indexPathForRow:6 inSection:0], nil] withRowAnimation:UITableViewRowAnimationNone]; // or NO ;)
  

Моя проблема в том, что у меня есть tableview с более чем 10 элементами, в которых отображается только 6 ячеек, но когда данные загружены и таблица прокручивается, в ячейке 7 нет данных. Как я могу перезагрузить данные в этой 1 ячейке?

Приведенный выше код — это то, что я использую, и он не работает!

—РЕДАКТИРОВАТЬ—

 if (cell == nil) {  

    cell =[[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:identifier]autorelease];
    //[cell setBackgroundColor: [UIColor clearColor]];




    mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(52.0, 0.0, 200.0, 20.0)] autorelease];           
    mainLabel.tag = 1;          
    mainLabel.font = [UIFont systemFontOfSize:14.0];            
    mainLabel.textAlignment = UITextAlignmentLeft;          
    mainLabel.textColor = [UIColor blackColor];
    mainLabel.opaque = YES;
    mainLabel.backgroundColor=[UIColor clearColor];
    [cell.contentView addSubview:mainLabel];

    revenue = [[[UILabel alloc] initWithFrame:CGRectMake(52.0, 20.0, 150.0, 20.0)] autorelease];            
    revenue.tag = 3;            
    revenue.font = [UIFont systemFontOfSize:14.0];          
    revenue.textAlignment = UITextAlignmentLeft;            
    revenue.textColor = [UIColor blackColor];
    revenue.opaque = YES;
    revenue.backgroundColor=[UIColor clearColor];
    [cell.contentView addSubview:revenue];

    promos = [[[UILabel alloc] initWithFrame:CGRectMake(252.0, 20.0, 150.0, 20.0)] autorelease];            
    promos.tag = 4;         
    promos.font = [UIFont systemFontOfSize:14.0];           
    promos.textAlignment = UITextAlignmentLeft;         
    promos.textColor = [UIColor blackColor];
    promos.opaque = YES;
    promos.backgroundColor=[UIColor clearColor];
    [cell.contentView addSubview:promos];

    updates = [[[UILabel alloc] initWithFrame:CGRectMake(252.0, 0.0, 200.0, 20.0)] autorelease];            
    updates.tag = 5;            
    updates.font = [UIFont systemFontOfSize:14.0];          
    updates.textAlignment = UITextAlignmentLeft;            
    updates.textColor = [UIColor blackColor];
    updates.opaque = YES;
    updates.backgroundColor=[UIColor clearColor];
    [cell.contentView addSubview:updates];

    photo = [[[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 50.0)] autorelease];
    photo.contentMode= UIViewContentModeScaleToFill;
    photo.tag = 2;
    photo.opaque = YES;
    photo.backgroundColor=[UIColor clearColor];
    [cell.contentView addSubview:photo]; 

}    
else {
    cell.clearsContextBeforeDrawing=YES;
    mainLabel = (UILabel *)[cell.contentView viewWithTag:1];    
    photo = (UIImageView *)[cell.contentView viewWithTag:2];
    promos=(UILabel *)[cell.contentView viewWithTag:4];
    revenue=(UILabel *)[cell.contentView viewWithTag:3];
    updates=(UILabel *)[cell.contentView viewWithTag:5];


    if(photo.image){
        photo.image=nil;
    }
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *imageURL =[NSString stringWithString:[(arrayResults*)[tweets objectAtIndex:indexPath.row] myCountryIcon]];

    NSArray *myArray = [imageURL componentsSeparatedByString: @"/"];
    NSString *fileName = [NSString stringWithString:[myArray lastObject]];
    NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/AppIcons"];
    NSString* path = [dataPath stringByAppendingPathComponent:fileName];
    UIImage* image = [UIImage imageWithContentsOfFile:path];
    if (!image) {

        UIApplication* app = [UIApplication sharedApplication];
        app.networkActivityIndicatorVisible = YES;
        // Create an array with the URL and name.  
        NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:fileName,imageURL, nil  ];  


        [self performSelectorInBackground:@selector(loadImageInBackground:)  withObject:arr]; 
        [arr release];


    }               
    else{
        photo.image=image;


    }
    NSString*promostext=[[NSString alloc] initWithFormat:@"promos:%@",[[(arrayResults*)[tweets objectAtIndex:indexPath.row] mypromos]stringValue] ];
    NSString*revenuetext=[[NSString alloc] initWithFormat:@"revenue:%@",[(arrayResults*)[tweets objectAtIndex:indexPath.row] myrevenue] ];
    NSString*updatestext=[[NSString alloc] initWithFormat:@"updates:%@",[[(arrayResults*)[tweets objectAtIndex:indexPath.row] myupdates]stringValue] ];

    mainLabel.text=[(arrayResults*)[tweets objectAtIndex:indexPath.row] myCountryName];
    promos.text=promostext;
    revenue.text=revenuetext;
    updates.text=updatestext;
    [promostext release];
    [revenuetext release];
    [updatestext release];

}
  

Комментарии:

1. Скорее всего, это ваш TableView:cellForRowAtIndexPath: это ошибка здесь. Можете ли вы опубликовать свой код?

2. Что насчет остальной части? Где вы на самом деле помещаете текст в метки и изображения в представлениях изображений?

3. извините, я сделал это в спешке, лол, я должен добавить, что я использую тот же код в другом приложении, и у меня нет этой проблемы

Ответ №1:

Обычно это неправильное использование механизма рециркуляции / повторного использования cellForRowAtIndexPath: .

Ячейки используются повторно при прокрутке, чтобы избежать выделения слишком большого количества UITableViewCells. Таким образом, вам нужно установить содержимое ячейки в cellForRowAtIndexPath: в обоих случаях, либо если ячейка только что была выделена (cell == nil), либо если ячейка была использована повторно (cell!= nil).

Комментарии:

1. итак, почему загружаются ячейки 1-6 и 8-10, а не 7? я должен добавить, что я использую тот же код в другом приложении, и у меня нет этой проблемы

2. Именно по той причине, которую я объяснил. Поскольку эти первые ячейки выделены, и вы заполняете их содержимое в cell==nil случае (так как нет уже выделенных, UITableViewCell но не используемых и повторно используемых данных, поэтому dequeueCellWithIdentifier возвращается nil ), но при прокрутке эти ячейки повторно используются (перерабатываются) для отображения другого содержимого, поэтому в этом случае вы переходите в cell!=nil случай, где, вероятно, есть проблема в вашем коде. Поместите точки останова в свой код, чтобы лучше понять, какой именно путь в коде выполняется в обоих случаях.

3. Особенно вам следует заполнить содержимое ваших меток, просмотров изображений и т.д. (И все, что изменяется между одной ячейкой и другой) вне if инструкции, чтобы заполнить ячейку в обоих случаях, тогда как эти ячейки были переработаны или просто выделены.