2012-06-27 3 views
1

У меня возникла проблема с UITableView и, точнее, с пользовательской ячейкой.Элементы, исчезающие из UITableViewCell при прокрутке

У меня есть контроллер табличного представления, скажем ControllerA, который отвечает за отображение разных TableViewCells. Эти ячейки являются пользовательскими ячейками, определенными в другом классе, скажем, ControllerCell. Каждая ячейка содержит одну из этих информационных кнопок (маленькую, круглую с «i»). Эти кнопки отображаются только тогда, когда есть что показать.

В ControllerCell, я определяю, что будет дальше:

@property (nonatomic, retain) IBOutlet UIButton *infoButton; 
@property (nonatomic, retain) IBOutlet UIAlertView *alert; 
@property (nonatomic, retain) IBOutlet NSString *info; 
- (IBAction)infoSupButton:(id)sender; 

, а также @synthesis, так же, как и все сделает. Тогда я определить, что будет происходить с предупреждением:

- (IBAction)infoSupButton:(id)sender { 
     alert = [[UIAlertView alloc] initWithTitle:@"Informations supplémentaires" 
                message:info 
                delegate:self 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
     if (info != nil) { 
     [alert show]; 
     } 
} 

А в разделе «initWithStyle», я

[_infoButton addTarget:self action:@selector(infoSupButton:) forControlEvents:UIControlEventTouchUpInside]; 

Это было для объявления ячейки.

Теперь давайте сосредоточимся на ControllerA.

Я разбираю XML-файл, чтобы получить данные «info», которые должны отображаться, когда вы нажимаете «infoButton». Это не проблема, потому что я могу получить эти данные и показать их в консоли.

После того как данные разбирается, я заполнить NSMutableArray, в разделе viewDidLoad:

tableInfoSup = [[NSMutableArray alloc] init]; 

Затем следуют классические методы:

-numberOfSectionsInTableView: (3 секции) -numberOfRowsInSection: (8 строки в разделе 0, 4 в разделах 1 и 4 в разделе 2) -cellForRowAtIndexPath:

У меня есть 3 разных раздела, отображающих ячейки с различной информацией, а в cellForRowAtI Метод NDEX, я:

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

static NSString *cellIdentifier = @"ExerciceTableCell"; 
ControllerCell *cell = (ControllerCell *)[tableView dequeueReusableCellWithIdentifier:exerciceTableIdentifier]; 

if (cell == nil) 
{ 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ExerciceTableCell" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 

} 


if (indexPath.section == 0) { 
    [...] 


    if ([[tableInfoSup objectAtIndex:indexPath.row] isEqualToString:@""]) { 
     [cell.infoButton setHidden:YES]; 
     cell.info = nil; 
    } 
    else { 
     cell.info = [tableInfoSup objectAtIndex:indexPath.row]; 
    } 

} 
if (indexPath.section == 1) { 
    [...] 

    if ([[tableInfoSup objectAtIndex:indexPath.row+8] isEqualToString:@""]) { 
     [cell.infoButton setHidden:YES]; 
     cell.info = nil; 
    } 
    else { 
     cell.info = [tableInfoSup objectAtIndex:indexPath.row+8]; //got the 8 rows from section 0; 
    } 

} 
if (indexPath.section == 2) { 

    [...] 

    if ([[tableInfoSup objectAtIndex:indexPath.row+12] isEqualToString:@""]) { 
     [cell.infoButton setHidden:YES]; 
     cell.info = nil; 
    } 
    else { 
     cell.info = [tableInfoSup objectAtIndex:indexPath.row+12]; //got the 8 rows from section 0, + 4 rows from section 1 
    }  
} 


return cell; 
} 

Теперь проблема заключается в том, что, когда на экране отображается на 1-е раз, все в Одере: Я получил клетку с маленькой кнопкой «я», показывая хорошую UIAlertView , некоторые другие ячейки не отображают кнопку ... Это нормально. Но после нескольких прокруток кнопки «i» начинают исчезать ... Я не знаю, почему.

Есть идеи? Спасибо :-)

ответ

3

В вашем tableView:cellForRowAtIndexPath: вы скрываете информацию, когда вы не хотите, чтобы она отображалась, но вы явно не скрываете ее для ячеек, где она должна отображаться.

Посмотрите на первые две строки этого метода: то, что вы - правильно, - это повторное использование ваших ячеек, поэтому, когда ячейки прокручиваются вне поля зрения, они удаляются из UITableView и помещаются в очередь повторного использования. Затем, когда ячейки становятся видимыми, TableView получает ячейки из этой очереди - или создает новые, если их нет.

Все это происходит очень хорошо, но через некоторое время ячейки с скрытыми информационными кнопками помещаются в очередь. И затем, спустя некоторое время, эти ячейки повторно используются - и иногда для строк, в которых должна быть информация, видимая.

Существует два решения: вы можете явно указать информацию для тех строк, где вы хотите, чтобы они показывались, или вы могли использовать два разных типа соты: один со скрытой информацией и один с видимой информацией. Затем вы даете каждой из этих ячеек другой идентификатор и основываясь на том, в какой строке находятся ячейки, задайте идентификатор перед деинкретированием/созданием ячеек.

+1

ОК, я думал, что это что-то с этими скрытыми ячейками ... Какова наилучшая практика «показать» их? Я этого никогда не делал! – tvincent

+2

Ну, в вашем случае, сделайте точно противоположное тому, что вы сделали, чтобы скрыть их: 'if (indexPath.section == someSectionWhereYouWantToShowInfo) {[cell.infoButton setHidden: NO]; cell.info = @ "Некоторая информация, которую вы хотите показать"; } ' – fzwo

+0

Так вот что я делаю сейчас: if ([[tableInfoSup objectAtIndex: indexPath.row] isEqualToString: @" "]) { [cell.infoButton setHidden: YES]; cell.info = nil; } else { [cell.infoButton setHidden: NO]; cell.info = [tableInfoSup objectAtIndex: indexPath.row]; } – tvincent