2012-06-14 4 views
28

У меня есть существующий ViewController + XIB в моем проекте, и теперь я хочу, чтобы добавить UITableView со статическими клеток, как это:Как использовать статические ячейки в UITableView без использования раскадровки?

TableView with static cells

Но когда я перетащить UITableView на моем экране я не в меню «Содержание»> «Статическое» в Инспекторе атрибутов.

Я пробовал сделать свой подкласс класса UITableViewController, но это не помогает - я все еще не получаю возможность использовать статические ячейки в Attributes Inspector.

Я просмотрел StackOverflow, но не нашел никаких существующих ответов на этот вопрос. Все существующие вопросы относятся к Storyboards (который я не использую) вместо xib-файлов.

Я полагаю, что Xcode делает какую-то магию, когда вы добавляете UITableViewController в раскадровку, но не тогда, когда вы меняете существующий xib наследования с UITableViewController.

Любой совет, как добавить табличный вид со статическими ячейками к существующему xib?

ответ

43

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

Для этого вы можете создать файл UIStoryboard с одним контроллером представления на нем, который имеет владельца файла, установленного в ваш пользовательский подкласс диспетчера. Установите идентификатор VC на некоторое значение. Когда вы хотите отобразить это, получите раскадровку, а затем создайте экземпляр своего подкласса контроллера, создав VC из раскадровки.

UIStoryboard *tableViewStoryboard = [UIStoryboard storyboardWithName:@"your storyboard" bundle:nil]; 
CustomViewController = [tableViewStoryboard instantiateViewControllerWithIdentifier:@"custom identifier"]; 

Вы можете представить этот VC, как обычно, в своем приложении.

Это отличный способ начать использовать раскадровки без необходимости конвертировать все ваше приложение, чтобы использовать их.

+5

Что касается производительности в этом случае? – mariusLAN

+1

не может создать раскадровку для ios 4.3 или ранее :( – tesmojones

22

Это выполнимо без раскадровки:

  1. контроллер должен принимать протоколы для Tableview делегата и источника ... UITableViewDelegate, UITableViewDataSource
  2. Добавить представление таблицы для вашего .xib; установите стиль табличного представления на «сгруппированные»
  3. Подключите таблицу к свойству в контроллере (назовем его «yourTableView»)
  4. Добавить ячейки таблицы таблицы в .xib как отдельные виды ... т. е. не как подземелья табличного вида ... они будут свободно плавать в .xib. (см. пример ниже)
  5. Добавить элементы управления/метки и т. д. в ячейки таблицы.
  6. Назначьте уникальные строки в поле «Идентификатор» в Атрибутах для каждой ячейки представления таблицы.
  7. Подключение ячеек таблицы других свойств в контроллере (sliderCell, switchCell и т.д.)
  8. Соединить отправки событий для управлений клеток к методам IBAction-е изд в контроллере - (IBAction) handleSliderCell и т.д.
  9. В методе viewDidLoad вашего контроллера, назначить делегат и источник табличном к контроллеру (self.yourTableControl.delegate = я; self.yourTableControl.dataSource = я;)
  10. осуществить numberOfSectionsInTableView, numberOfRowsInSection и cellForRowAtIndexPath в контроллере
  11. в Tableview: cellForRowAtIndexPath :, вернуться yourFirstCell, yourSecondCell, и т.д. указатели для соответствующего indexPath дорожит

Событие для элементов управления для ячеек таблицы должны идти к вашей процедуре обработчика ...

Пример шага 4: xib

+1

Есть ли какие-либо преимущества этого подхода, если вы просто ориентируете версии iOS, где поддерживаются раскадровки? – philwilks

+0

Не работает для меня. Я получаю ** не могу загрузить nib в bundle **. И я не могу зарегистрировать nib явно, потому что нет классов, связанных с ячейками, созданными в IB. Поэтому я просто создал подклассы 'UITableViewCell' и добавил их в ячейки и снова попытался, но все равно не повезло – Isuru

+1

@philwilks - преимущество этого по сравнению с раскадными версиями заключается в том, что вы получаете преимущества управления конфигурацией от использования раскадровки - поэтому, если несколько разработчиков обновляют пользовательский интерфейс, который вы не получите в такой путанице –

0

Чтобы расширить ответ Боруссии, в когда дело доходит до № 10, здесь Swift 3 сниппеты для ваших методов делегата Tableview. Обязательно добавьте выходы во все ваши ячейки в xib.

Когда вы вручную создаете разделы просмотра таблиц, помните, что indexPath равно 2-мерному массиву, представляющему вашу структуру таблицы. например, когда indexPath передано в tableView(cellForRowAt indexPath: IndexPath), равно [1][0], ваша ячейка будет помещена в первую позицию второй секции.

Значения можно вытащить из indexPath со свойствами indexPath.row и indexPath.section. Используя эти значения, вы можете вручную создавать свои разделы из своих IBOutlets в том порядке, в котором вы предпочитаете.

@IBOutlet var is_enabled: UITableViewCell! 
@IBOutlet var is_public: UITableViewCell! 

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    switch(section){ 
     case 0: 
      return "Cell 1" 
     case 1: 
      return "Cell 2" 
     default: return "" 

    } 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 1 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 2 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    print("index path here", indexPath) 
    if(indexPath.section == 0) { 
     return is_enabled 
    } 
    else if(indexPath.section == 1) { 
     return is_public 
    } else { 
     return is_enabled 
    } 
} 
Смежные вопросы