2012-05-18 6 views
28

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

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

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

ответ

48

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

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

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

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

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

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

    ... 

    if (tableView == self.firstTableView) { 

     ... 

    } else { // tableView == self.secondTableView 

     ... 
    } 
} 

return cell; 

}

+0

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

+0

Бонус: у вас нет двух контроллеров, которые контролируют один вид, который «может» стать настоящей болью, когда он пойдет не так ... – Damo

+1

+1 - эту реализацию намного легче адаптировать и следует за шаблонами проектирования Apple для использования UISearchDisplayController. – CaptainRedmuff

4

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

Подход 1 - создать одну таблицу View Controller и изменить источник данных

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

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

  • При таком подходе, безусловно, есть дополнительный и повторный код.
  • Но с этим сложнее.
+1

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

+1

@woutr_be - вот почему я сказал, что предпочел бы второй, так как я хочу избежать дополнительной сложности. – rishi

+0

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

0

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

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

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

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

+0

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

+0

@MikeSimz Да, по умолчанию они делают именно это. Однако вы можете использовать общий источник данных, если хотите, установив его как на 'UITableView'. –

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

    ... 

    if (tableView.tag == 1) { 

     ... 

    } else { // tableView == self.secondTableView 

     ... 
    } 
} 

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

4

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

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

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

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

+0

это выглядит интересно .. Какие методы вы используете/изменяете для достижения этого эффекта? Примеры кода были бы замечательными. –

+0

@DavidDelMonte, я бы не смог поделиться с вами каким-либо примером. Но вы можете сделать метод, который скроет все таблицы и отобразит только определенную таблицу, для которой вы ищете. В 'cellForRowAtIndexPath' вы можете различать каждую таблицу по ее тегу. – Hemang

+0

Я получил его работу Хеманг. Огромное спасибо. –

Смежные вопросы