2 UITableViews в одном UIView
У меня есть UIView
, который должен отображать два UITableViews, но они никогда не отображаются вместе, используя SegementedBar
, вы можете переключать ту или иную.
Каким будет лучший способ справиться с этим? Просто создайте один Table View Controller
и измените источник данных или создайте 2 Table View Controllers
и просто скройте его, когда другой будет видимым.
2 таблицы будут иметь совершенно другой макет с различными пользовательскими ячейками.
Ответы
Ответ 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
.