Цель C: текст ячейки исчезает после прокрутки за пределы экрана (и назад) - PullRequest
2 голосов
/ 17 июня 2011

Я создаю контроллер с UITableview, который содержит 2 раздела. Во втором разделе у меня есть список пользователей, которым я хочу добавить галочку для пользователя в списке, когда я нажимаю на конкретную строку. У меня есть проблема, из-за которой после того, как я нажимаю на пользователя и прокручиваю ячейку со страницы, ячейка возвращается с полем «имя» ПУСТО (см. Скриншот ниже). Я знаю, что это связано с тем, как клетки используются повторно, но я не могу разобраться с точным вопросом. Мой код размещен ниже. Любой совет?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* ShareOnCellIdentifier = @"ShareOnholderCell";
    static NSString* WhoShouldAnswerCellIdentifier = @"WhoShouldAnswerCell";

    int row = [indexPath row];

    User *user = [self.friendsToShareWithArray objectAtIndex:row];

    if (indexPath.section == 0) 
    {

        UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:ShareOnCellIdentifier];
        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ShareOnCellIdentifier];
        }
        cell.textLabel.text = [self.shareOnArray objectAtIndex:indexPath.row];

        return cell;

    }
    else
    {
        UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:WhoShouldAnswerCellIdentifier];
        if (cell == nil)
        {
             cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:WhoShouldAnswerCellIdentifier];
         }
        cell.textLabel.text = user.nickname;
        if (user.isSelected) 
        {
            cell.selectionStyle = UITableViewCellAccessoryCheckmark;
        }
        else
        {
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }
        return cell;
    }

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    User *user = [self.friendsToShareWithArray objectAtIndex:indexPath.row];
    if (indexPath.section == 1) 
    {
        UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];

        if (cell.accessoryType == UITableViewCellAccessoryCheckmark) 
        {
            cell.accessoryType = UITableViewCellAccessoryNone;
            user.isSelected = NO;

        }
        else
        {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
            user.isSelected = YES;
        }
    }
}

РЕДАКТИРОВАТЬ: Пример того, как я создаю свой пользовательский объект

User *user1 = [[User alloc]init];
    user1.nickname = @"Dionis";
    user1.uid = @"1";
    user1.isSelected = NO;

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

Единственная проблема, которую я вижу, в том, как вы внедрили метод didSelectRowAtIndexPath:.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 1) 
    {
        User *user = [self.friendsToShareWithArray objectAtIndex:indexPath.row];
        user.isSelected = !user.isSelected;

        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
                         withRowAnimation:UITableViewRowAnimationNone];
    }
}
1 голос
/ 17 июня 2011

В прошлом у меня была такая проблема, вызванная неосознанием того, что в основном каждый раз, когда ячейка появляется в прокручиваемой UITableView, она будет повторно запрашиваться через cellForRowAtIndexPath. Я не вижу здесь ошибки (вы всегда устанавливаете текст метки), но на этом этапе я бы предложил проверить текст метки после ее установки.

if (!cell.textLabel.text || [[cell.textLabel.text stringByReplacingOccurrencesOfString:@" " withString:@""] isEqualToString:@""])
    NSAssert(NO, @"Bad text!");

Запуск в режиме отладки приведет к «краху» на NSAssert, если текст пустой или ноль. Тогда вы сможете проверить окружающие переменные (может ли user быть нулем или что-то в этом роде?) И узнать больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...