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

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

Сначала, я показываю экран входа в систему:

self.tableView.dataSource = loginTableView;
self.tableView.delegate = loginTableView;
[self.tableView reloadData];

Затем как только пользователь вошел в систему, я делаю следующее для изменения на index:1 segmentedControler, который является их профилем:

self.tableView.dataSource = profileTableView;
self.tableView.delegate = profileTableView;
[self.tableView reloadData];

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

Есть ли иначе, я должен изменять источник данных для UITableView?

Спасибо

14
задан runmad 14 January 2010 в 18:48
поделиться

3 ответа

Не уверены, почему это происходит с кода, который вы разместили.

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

- (NSArray*)tableData{

    if(showingLogin)
        return self.loginData;

    return self.profileData;
}

Теперь у вас есть только экземпляр 1 UiableViewController, но BoOL, чтобы сказать вам, каковы источники данных для использования.

4
ответ дан 1 December 2019 в 13:47
поделиться

вау, это причудливое.

Последний раз, когда я сделал что-то подобное, я просто использовал несколько видов, скрывая один и показывающую другой, когда был постучен сегментированный контроль. Есть и другие возможные решения, но это, вероятно, простое и, возможно, наиболее эффективно.

0
ответ дан 1 December 2019 в 13:47
поделиться

Табличное представление кэширует внутренние ячейки, которые оно использует для отображения ваших данных. Поэтому, если вы измените источник данных, вы также должны убедиться, что ваш метод - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath обновляет все ячейки до правильных новых значений.

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.frame = CGRectZero;
        cell.textLabel.font = //Set font;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.textLabel.text = @"My Text for this cell"; // <==== Not good! Move it out of this if block
    }
    // Set cell text here
}

Самое простое решение, которое я нашел для такого рода проблем, - просто сделать строку, которую вы используете для создания ячейки (CellIdentifier), в зависимости от источника данных. В этом случае вы не смешиваете ячейки с разными типами контента (и это также помогает, если ячейки должны иметь разный вид в зависимости от режима).

3
ответ дан 1 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: