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

Как использовать статические ячейки в UITableView без использования раскадровки?

У меня есть существующий ViewController + xib в моем проекте, и теперь я хочу добавить UITableView со статическими ячейками, например:

TableView with static cells

Но когда я перетаскиваю UITableView на свой экран, у меня нет меню "Content > Static" в Инспекторе атрибутов.

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

  • ваш контроллер должен принимать протоколы для делегата tableview и источник... UITableViewDelegate, UITableViewDataSource
  • Добавить табличный вид на ваш .xib; установите стиль представления таблицы в "сгруппированный"
  • Подключите таблицу к свойству в вашем контроллере (позвольте называть его "yourTableView" )
  • Добавить ячейки таблицы представления в .xib как отдельные виды... т.е. а не в виде представлений в виде таблицы... они будут свободно плавать в .xib. (см. пример ниже)
  • Добавить элементы управления/метки и т.д. в ячейки таблицы.
  • Назначьте уникальные строки в поле "Идентификатор" в Атрибутах для каждой ячейки представления таблицы.
  • Подключите ячейки таблицы к другим свойствам контроллера (sliderCell, switchCell и т.д.)
  • Подключить события отправки для элементов управления ячеек к методам IBAction-ed в контроллере   - (IBAction) handleSliderCell и т.д.
  • В методе viewDidLoad вашего контроллера назначьте делегат и источник представления таблицы контроллеру (self.yourTableControl.delegate = self; self.yourTableControl.dataSource = self;)
  • реализовать numberOfSectionsInTableView, numberOfRowsInSection и cellForRowAtIndexPath в контроллере
  • в tableView: cellForRowAtIndexPath:, верните указатели yourFirstCell, yourSecondCell и т.д. для соответствующих значений indexPath

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

Пример для шага 4: xib

Ответ 3

Чтобы расширить ответ на BVB, когда дело доходит до номера 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
    }
}