iPhone: Изменяет порядок ячеек в разделе UITableView после вызова reloadSections: Method - PullRequest
1 голос
/ 30 марта 2010

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

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

Section 0:
    0 row with segmented control showing name, barcode and camera buttons
Section 1:
    // button zero, name button
    0 row with textfield
    1 row with textfield 
or 
    // button 1, barcode button
    0 row with textfield
or 
    // button 2, camera button
    // shows camera view

Я поместил заполнители в каждом UITextField.

Каждый раз, когда нажимается кнопка в сегментированном элементе управления, я вызываю pickOne: метод, который обновляет табличное представление. В этом методе я создаю NSIndexSet с NSRange (1, 1), а затем вызываю reloadSections: метод UITableViewController с NSIndexSet в качестве параметра.

Когда вид появляется в первый раз, все в порядке, но когда я несколько раз нажимаю на кнопки, порядок ячеек меняется. Ячейки, содержащие два textFields для button0 и новые placeHolders, записываются поверх старых. Хуже того, иногда, когда я нажимаю кнопку 0, отображается только вторая ячейка из двух ячеек.

Мой подробный код можно посмотреть здесь http://pastebin.com/9GwMpCS9

Ответы [ 2 ]

0 голосов
/ 30 марта 2010

Я думаю, что ваша проблема здесь.

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    //....

        if(addMode == NAME) {
            if(indexPath.row == 0) {
                [cell addSubview:nameTextField];
            }
            else if(indexPath.row == 1) {
                [cell addSubview:categoryTextField];
            }
        }
        else if(addMode == BARCODE) {
            [cell addSubview:barcodeTextField];
        }
        else if(addMode == SCAN){

            //Scanning mode
        }
    }
    return cell;
}

Это потому, что таблица всегда имеет два раздела, этот метод всегда вызывается для раздела 1. Независимо от выбранного типа ввода, он создает или удаляет ячейку из очереди и возвращает ее. Всякий раз, когда addMode == SCAN, он случайным образом удаляет одну из ранее использованных ячеек для имени или штрих-кода addMode и возвращает его.

Я предлагаю полностью удалить логику SCAN из таблицы или создать строку для камеры.

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

0 голосов
/ 30 марта 2010

Я вижу пару проблем.

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

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

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