Как загрузить UITableView из файла nib в представление контейнера в контроллере родительского представления?

#swift #uitableview #xib #nib #uicontainerview

#swift #uitableview #xib #перо #uicontainerview

Вопрос:

Я пытаюсь загрузить контроллер представления (назовем его VC2), который содержит табличное представление, в представление контейнера в контроллере родительского представления (VC1). Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь зарегистрировать nib или установить делегат / источник данных для tableview в VC2, я получаю нулевую ошибку.

Я попытался удалить delegate dataSource соединение и, но это просто загружает пустой tableview

Это код, который я использовал для передачи данных в контроллер представления контейнера:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let listVC = segue.destination as? BusinessListViewController {
            listVC.bottomSheetDelegate = self
            listVC.Businesses = self.Businesses
            listVC.parentView = businessListView
            listVC.viewDidLoad()
         }
    }
  

и это viewDidLoad() утверждение в VC2

     override func viewDidLoad() {
        super.viewDidLoad()
        BusinessListTableView.dataSource = self
        BusinessListTableView.delegate = self 
        BusinessListTableView.register(UINib.init(nibName: "BusinessTableViewCell", bundle: nil), forCellReuseIdentifier: "BizCell")
    }
  

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

Комментарии:

1. Для меня это странно, но, в конце концов, вы обновили свой UITableView с помощью .reloadData()?

2. Как вы настроили сдерживание контроллера представления? Вам нужно добавить VC2 как a child в контейнер, добавить VC2 представление в иерархию представлений контейнера, установить VC2 frame в контейнере (установить ограничения), а затем вызвать didMove(toParent:) . Смотрите Руководство Apple

3. Первое замечание: никогда не вызывайте viewDidLoad() — это вызывается автоматически, и если вы считаете, что его нужно вызвать, вы делаете что-то еще неправильно. Далее: вы говорите, что «пытаетесь загрузить viewcontroller (назовем это VC2), который содержит tableview, в containerview в родительском viewcontroller (VC1)» … покажите код, который вы используете для этого. Скорее всего, вы делаете не то, что вам нужно.

4. @DonMag Я встраиваю VC2 в представление контейнера, и все это делается с помощью конструктора интерфейсов. Таким образом, для этого не установлено никакого кода

5. Действительно сложно сказать, используя только предоставленную вами информацию… «когда я пытаюсь зарегистрировать nib или установить делегат / источник данных для tableview в VC2, я получаю нулевую ошибку» Что такое nil? Вы также говорите, что «Это работало при переходе к VC2 через переход» .. но код, который вы показали , переходит к нему через переход. Используйте отладчик для пошагового просмотра вашего кода и проверки переменных, чтобы вы могли выяснить, в чем разница между тем, когда он «работает», а когда нет.

Ответ №1:

Предположительно, у вас есть закрытие, когда ваш код извлекает данные? Если это так, сохраните ссылку на «VC2» в prepareForSegue и установите данные в этом замыкании.

Псевдокод:

 class ViewController1: UIViewController {

    var vc2: ViewController2!

    override func viewDidLoad() {
        super.viewDidLoad()

        callToGetData() {
             onCompletion {
                 vc2.Businesses = self.Businesses
                 vc2.reload()
             }
        }

   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let listVC = segue.destination as? BusinessListViewController {
            listVC.bottomSheetDelegate = self
            listVC.parentView = businessListView
            vc2 = listVC
         }
    }
}