У меня есть 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?
Спасибо
Не уверены, почему это происходит с кода, который вы разместили.
Вместо того, чтобы изменить делегат и DataSource, переключитесь на то, что Иван представляет собой отображаемые данные:
- (NSArray*)tableData{
if(showingLogin)
return self.loginData;
return self.profileData;
}
Теперь у вас есть только экземпляр 1 UiableViewController, но BoOL, чтобы сказать вам, каковы источники данных для использования.
вау, это причудливое.
Последний раз, когда я сделал что-то подобное, я просто использовал несколько видов, скрывая один и показывающую другой, когда был постучен сегментированный контроль. Есть и другие возможные решения, но это, вероятно, простое и, возможно, наиболее эффективно.
Табличное представление кэширует внутренние ячейки, которые оно использует для отображения ваших данных. Поэтому, если вы измените источник данных, вы также должны убедиться, что ваш метод - (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), в зависимости от источника данных. В этом случае вы не смешиваете ячейки с разными типами контента (и это также помогает, если ячейки должны иметь разный вид в зависимости от режима).