UITextField артефакты - PullRequest
       17

UITextField артефакты

0 голосов
/ 22 марта 2012

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

Иногда, когда приложение загружается впервые, и обычно, когда оно полностью удалено с телефона, поля UITextField из исходного раздела таблицы отображаются в дополнение к новым строкам, как показано ниже (основная таблицараздел выше)

enter image description here:

Самое странное в этом то, что это происходит только при первом отображении этого экрана - после этого все выглядит нормально.О, и кажется, что это происходит только на телефоне, а не на симуляторе.

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

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

- (void)accountSwitchChanged {
[customerDetails saveField:@"addToAccount" WithBool:addToAccountSwitch.on];

NSArray *indexes = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:1 inSection:1], [NSIndexPath indexPathForRow:2 inSection:1], [NSIndexPath indexPathForRow:3 inSection:1],nil];

if (addToAccountSwitch.on)
    [detailsTable insertRowsAtIndexPaths:indexes withRowAnimation:UITableViewRowAnimationFade];
else
    [detailsTable deleteRowsAtIndexPaths:indexes withRowAnimation:UITableViewRowAnimationFade];
}

Любые идеи?

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

cellForRowAtIndexPath Код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// get rid of grey background for iPad app
[tableView setBackgroundView:nil];
UITableViewCell *cell = nil;
NSDictionary *cellData = [[dataSourceArray objectAtIndex: indexPath.section] objectAtIndex:indexPath.row];

id cellControl = [cellData objectForKey:kCellControlKey];

    static NSString *kCellControl = @"CellControl";
    cell = [tableView dequeueReusableCellWithIdentifier:kCellControl];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellControl] autorelease];
        cell.textLabel.textColor = [[[ConfigManager sharedInstance].skin valueForKey:@"tableCellHeadingTextColour"] toUIColor];
        cell.backgroundColor = [[[ConfigManager sharedInstance].skin valueForKey:@"tableCellBgColour"] toUIColor];
        cell.textLabel.font = [UIFont boldSystemFontOfSize:17];
    } else {
        // a cell is being recycled, remove the old control (if it contains one of our tagged edit fields)
        UIView *viewToCheck = nil;
        viewToCheck = [cell.contentView viewWithTag:kDetailsViewTag];
        if (!viewToCheck)
            [viewToCheck removeFromSuperview];
    }

    // if control is not a text field, make it a button
    if (![cellControl isKindOfClass:[UITextField class]])
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    else
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

    cell.textLabel.text = [cellData objectForKey:kCellTitleKey];
    [cell.contentView addSubview:cellControl];

return cell;
}

1 Ответ

1 голос
/ 22 марта 2012

Что-то, что нужно проверить и устранить Если это происходит только при первом отображении представления, всегда стоит проверить, предполагается ли, что представление загружено, прежде чем выполнять над ним работу. Это происходит не очень часто, но когда это происходит, может быть очень трудно отследить. Чтобы проверить, может ли это быть вашей проблемой, добавьте вызов [viewController view] сразу после того, как вы впервые создадите представление. Это заставляет представление быть загруженным. Если проблема исчезнет, ​​когда вы добавите это, вы отследили источник проблемы. И вы даже можете оставить вызов [viewController view] как исправление или поработать над своим кодом, чтобы учесть ленивую реализацию.

Все это говорит о том, что в вашем табличном представлении гораздо вероятнее будет что-то смешное: cellForRowAtIndexPath: code. Если вы хотите хорошее переполнение стека, опубликуйте весь или соответствующий фрагмент этого кода (или соответствующий код, который он вызывает).

Следите за по опубликованному коду:

(1) if (!viewToCheck) [viewToCheck removeFromSuperview] ничего не сделает. Он только отправит сообщение removeFromSuperview, когда viewToCheck равен нулю, и это ничего не сделает. Не уверен, что это будет ключевой вопрос, но это то, что нужно исправить.

(2) [cell.contentView addSubview:cellControl]; - это выглядит проблематично - обычно лучше добавлять подпредставления только при создании ячейки. Вы можете скрыть или показать в основной части tableView: cellForRowAtIndexPath: - это, я подозреваю, сработает для вас здесь. С этим кодом есть риск, что вы либо добавите несколько подпредставлений, когда захотите только одно, либо (что может быть здесь происходит), что в итоге вы не удалите подпредставление, когда ячейка будет переработана. Если предполагается, что код viewToCheck удаляет добавленный cellControl, то, как (1), он не будет делать это сейчас, потому что ваше условие if неверно.

...