UITableView indexPath раздел логики - PullRequest
5 голосов
/ 02 декабря 2011

Это сокращенный код для моего метода делегата cellForRowAtIndexPath UITableView:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"];
if (cell == nil) {
    // No cell to reuse => create a new one
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"blahblahblah"] autorelease];
}
cell.textLabel.text = @"";
cell.detailTextLabel.text = @"";
cell.backgroundView = NULL; //problem here

// Initialize cell
//blah blah blah
//now to the good part...

if(indexPath.section == 1) {
    cell.backgroundView = deleteButton;
    cell.userInteractionEnabled = YES;
    cell.textLabel.text = nil;
    cell.detailTextLabel.text = nil;
}

else if(indexPath.section == 0) {
    NSLog(@"section: %i row: %i", indexPath.section, indexPath.row);
    switch (indexPath.row) {
        case 0:
            cell.textLabel.text = @"foobar";
            //more stuff
            break;

        //lots more cases

        default:
            break;
    }
}

return cell;

}

Моя проблема заключается в том, что первая ячейка в разделе 1 (раздел 0 имеет 10 ячеек, раздел 1имеет только 1 ячейку) получает назначенную информацию, которая должна быть назначена только ячейке 0 первого раздела.Таким образом, вместо получения фона deleteButton и т. Д., Он получает заголовок метки «foobar».Я не совсем уверен, почему это происходит, потому что мои утверждения if довольно ясны.Любые идеи?

Редактировать: установка backgroundView в NULL приводит к тому, что те ячейки с текстом, когда они покидают вид, возвращаются без какого-либо фона.Так что это не жизнеспособное решение.Кроме того, текст для detailTextLabel по-прежнему установлен в ячейке, в которой не должно быть текста.

Вот как это выглядит, для фона backgroundViews в ячейке установлено значение nil, а текст отображается в ячейке удаления, гдеэто не должно:

enter image description here

Решение, рекомендованное Алексом Димом (замена старого кода очереди на данный код):

NSString* identifier;
if(indexPath.section == 0)
    identifier = @"0";
else
    identifier = @"1";
UISwitch *switchView;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
    // No cell to reuse => create a new one
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier] autorelease];

Ответы [ 3 ]

5 голосов
/ 02 декабря 2011

Вы должны прочитать документацию относительно повторного использования ячеек.

Вы должны использовать разные reuseIdentifier для каждого из двух разделов, так как они представляют собой принципиально разные ячейки.

0 голосов
/ 02 декабря 2011

Ваш код структурирован неправильно.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"];
if (cell == nil) 

dqueueReuseableCellWithIdentifier вернет существующую ранее созданную ячейку, если она больше не используется.If cell == nil Вы должны создать новую ячейку и установить значения по умолчанию, общие для всех ячеек.Однако любая настройка данных, уникальная для этого indexPath, должна выполняться после

if(cell==nil) block.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"];
if (cell == nil) 
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1         reuseIdentifier:@"blahblahblah"] autorelease];
}
cell.textLabel.text=@"unique text";
return cell;
0 голосов
/ 02 декабря 2011

добавьте закрывающую скобку } к этим строкам кода:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"];
if (cell == nil) {
    // No cell to reuse => create a new one
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"blahblahblah"] autorelease];
}
....
....
....
if(indexPath.section == 1) {
   ....
   ....
}
if(indexPath.section == 0) {
   ....
   ....
}

, и я подозреваю, что у вас будут лучшие результаты в вашей таблице.(по крайней мере, насколько я могу судить по вашему коду), вы создаете одну ячейку, и она инициализируется чем-то.Он никогда не возвращается к значениям и данным чего-либо еще, что запрашивается.

...