Повторное использование ячеек UITableView вызывает сбой, когда ячейка перерабатывается - PullRequest
0 голосов
/ 22 февраля 2012

Я пытаюсь повторно использовать cellViews с использованием тегов и идентификаторов ячеек, однако приведенный ниже код дает сбой при повторном использовании ячейки. Я думаю, что я почти там. Кто-нибудь может увидеть ошибку?

// Customize the appearance of table view cells.
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    const NSInteger BUTTON_TAG = 1001;
    const NSInteger SWITCH_TAG = 1002;
    const NSInteger TEXTFIELD_TAG = 1003;

    NSString *CellIdentifier = @"";
    if(indexPath.section == 2 && indexPath.row == 0)
        CellIdentifier = @"Button";
    else if (indexPath.section == 3)
        CellIdentifier = @"Switch";
    else
        CellIdentifier = @"TextField";


    UISwitch *switchView;
    UITextField *textField;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        if (CellIdentifier == @"TextField")
        {
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            CGRect frame = CGRectInset([cell.contentView bounds], 70, 10);
            textField = [[[UITextField alloc] initWithFrame:frame] autorelease];
            textField.keyboardType = UIKeyboardTypeDefault;
            textField.returnKeyType = UIReturnKeyDone;
            textField.autocorrectionType = UITextAutocorrectionTypeNo;
            textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
            textField.delegate = self;

            cell.accessoryView = textField;
            cell.tag = TEXTFIELD_TAG;

        }
        else if (CellIdentifier == @"Button")
        {
            cell.selectionStyle = UITableViewCellSelectionStyleBlue;
            cell.textLabel.textAlignment = UITextAlignmentCenter;
            cell.clipsToBounds=YES;
            cell.tag = BUTTON_TAG;
        }
        else if (CellIdentifier == @"Switch")
        {
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            switchView = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];

            cell.accessoryView = switchView;
            cell.tag = SWITCH_TAG;
        }
    }
    else
    {
        textField = (UITextField*)[cell viewWithTag:TEXTFIELD_TAG];
        switchView = (UISwitch*)[cell viewWithTag:SWITCH_TAG];     
    }

Crash Log

2012-02-22 14:50:08.352 ***[2304:207] -[UITableViewCell setSecureTextEntry:]: unrecognized selector sent to instance 0x6368270
2012-02-22 14:50:08.355 ***[2304:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCell setSecureTextEntry:]: unrecognized selector sent to instance 0x6368270'

Ответы [ 3 ]

0 голосов
/ 22 февраля 2012

Вы не говорите, что такое сбой, или не предоставляете обратный след, но одна проблема, которую я сразу вижу, состоит в том, что вы всегда делаете:

switchView = (UISwitch*)[cell viewWithTag:SWITCH_TAG];     

для всех переработанных ячеек, даже если только один из трех типов имеет switchView.

Вы также устанавливаете TEXTFIELD_TAG только для одного типа ячеек, но обращаетесь к нему при доступе ко всем типам «переработанных» ячеек.

ИЗМЕНЕНО ДЛЯ ДОБАВЛЕНИЯ: Я вижу, что вы добавили исключение из своей консоли. Исключение выдается при вызове на setSecureTextEntry. Я не вижу setSecureTextEntry нигде в коде, который вы копируете и вставляете в вопрос, поэтому я рекомендую искать setSecureTextEntry в вашем реальном коде, и где бы он ни вызывался, убедитесь, что UITextField получает этот вызов а не UITableViewCell (который может быть суперобзором, в котором живет безопасный UITextField).

0 голосов
/ 22 февраля 2012

Начните с добавления новых элементов управления в contentView (или ячейку) в виде подпредставлений, например:

[cell.contentView addSubview:textField];

... и т. Д. Для других представлений.Посмотрите, исправляет ли это ошибку.

Кроме того, как указывает @Eugene, вам не поможет установить тег в ячейке.Установите тег на представлениях, которые вы создаете.(Хотя я сомневаюсь, что это стоит за твоей аварией).

0 голосов
/ 22 февраля 2012

Рядом с закомментированной линией выделения ячеек вы устанавливаете свойства .tag для ячеек вместо текстовых полей и переключателей, это, скорее всего, является причиной сбоев. Также опубликуйте журнал сбоев, чтобы мы увидели, что именно приводит к сбою приложения.

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