2010-01-14 2 views
13

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

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

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

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

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

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

Есть ли другой способ изменить источник данных для UITableView?

Thx

ответ

4

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

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

- (NSArray*)tableData{ 

    if(showingLogin) 
     return self.loginData; 

    return self.profileData; 
} 

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

0

Вау, это причудливый.

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

+0

Да, я делал это, но тогда вы не можете прокручивать страницу через statusBar, и у меня были проблемы с нажатием просмотров. – runmad

2

Вид таблицы кэширует ячейки, используемые внутри, для отображения ваших данных. Поэтому, если вы измените источник данных, вы также должны проверить, что ваш - (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) ​​в зависимости от источника данных. В этом случае вы не смешиваете ячейку разных типов контента (и это также помогает вам, если ячейки должны иметь другой вид в зависимости от режима).

9

У меня была такая же проблема. Мое решение состояло в том, чтобы сделать tableView скрытым, изменить его источник, перезагрузить данные и снова отобразить tableView.

Пример в C# (MonoTouch):

tableView.Hidden = true; 
tableView.Source = newTableViewSource; 
tableView.ReloadData(); 
tableView.Hidden = false; 
+0

Большое спасибо за ваш пост, я изо всех сил пытался изменить источники данных в течение нескольких месяцев! – TChadwick

0

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

if (self.segmentedControl.selectedSegmentIndex == 0) { 
    self.cellIdentifier = @"segmentOne"; 
} else { 
    caseAtIndexPath = [self.awaitingReviewCaseList caseAtIndex:indexPath.row]; 
    self.cellIdentifier = @"segmentTwo"; 
} 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier forIndexPath:indexPath]; 
1

я эту проблему, оказалось, это было потому, что мои CellIdentifiers были такими же ...

static NSString *CellIdentifier = @"Cell"; 

Изменить один из них и клетки макет правильно

static NSString *CellIdentifier2 = @"Cell2"; 
Смежные вопросы