Подтвердить что ты не робот

2 UITableViews в одном UIView

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

Каким будет лучший способ справиться с этим? Просто создайте один Table View Controller и измените источник данных или создайте 2 Table View Controllers и просто скройте его, когда другой будет видимым.

2 таблицы будут иметь совершенно другой макет с различными пользовательскими ячейками.

4b9b3361

Ответ 1

Я бы сохранил один источник данных и делегат.

Это означает, что все методы делегирования/источника данных становятся более сложными, но это означает, что вы можете сохранить отношения "один к одному" между viewController и представлением.

сохранить ссылку на каждый вид таблицы

//vc.h
@property (nonatomic, weak) IBOutlet UITableView* firstTableView;
@property (nonatomic, weak) IBOutlet UITableView* secondTableView;

В методах datasource/delegate вам необходимо учитывать тот факт, что метод должен вести себя по-разному в зависимости от того, какой вид таблицы используется. например.

//vc.m
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    if (tableView == self.firstTableView) {

        ...

    } else { // tableView == self.secondTableView

        ...
    }
}

return cell;

}

Ответ 2

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    if (tableView.tag == 1) {

        ...

    } else { // tableView == self.secondTableView

        ...
    }
}
Тег

может быть назначен из .xib. поэтому нет необходимости иметь переменную UITableVeiw в файле .h. Требуется два вида таблицы в .xib

Ответ 3

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

Подход 1 - создайте один контроллер табличного представления и измените источник данных

  • Этот подход помогает избежать лишнего и повторяющегося кода.
  • С этим управлением памятью полезно использовать только один контроллер. (Хотя это не является большой проблемой, до тех пор мы не будем иметь много данных.)
  • Проблема с этим имеет сложность.

Подход 2 - 2 Table View Controller

  • При таком подходе определенно есть дополнительный и повторяющийся код.
  • Но при этом это не так сложно.

Ответ 4

В моем текущем приложении мне нужно иметь 4 UITableView в одном UIViewController, сразу я должен показать отдельную таблицу на основе выбранной пользователем вкладки, я добавил четыре таблицы, потому что, все из которых имеют разные пользовательские ячейки и функциональность, чтобы уменьшить сложность, которую я взял четыре.

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

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

Я сохраняю cellForRowAtIndexPath как можно меньше, деля код на разные функции.

Ответ 5

Используйте отдельный UITableViewControllers и обменивайте представления. Это меньше кода, меньше сложности, и это способ, которым Apple делает это с помощью TabBar.

Что же касается сложности кода, там действительно нет. Для переключения представлений при изменении значения UISegmentedControl вы просто выполняете следующее:

UIView *previousSuperview = myViewController1.view.superview;
myViewController2.view.frame = myViewController1.view.frame;
[myViewController1.view removeFromSuperview];
[previousSuperview addSubview:myViewController2.view];

В качестве альтернативы вы можете установить соответствующее представление hidden.