#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
как achild
в контейнер, добавитьVC2
представление в иерархию представлений контейнера, установитьVC2
frame
в контейнере (установить ограничения), а затем вызватьdidMove(toParent:)
. Смотрите Руководство Apple3. Первое замечание: никогда не вызывайте
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
}
}
}