#ios #swift #controller #null
#iOS #swift #контроллер #null
Вопрос:
У меня есть два viewControllers
в раскадровке, ViewController
(root) и TableViewController
, которые связаны с помощью push-перехода.
TableViewController
Действует как страница настроек приложения, и в нее помещаются несколько UIControls
таких как UISegmentedControl
и UISwitch
. Они UIControls
связаны с TableViewController
via IBOutlets
.
@IBOutlet weak var mySegmentedControl: UISegmentedControl!
@IBOutlet weak var mySwitch: UISwitch!
Однако, когда я вызываю их UIControls
в ViewController
с помощью:
let tableView: TableViewController = TableViewController.init(nibName: nil, bundle: nil)
if tableView.mySwitch.isOn {
//perform actions
}
При сообщении if появляется ошибка:
неустранимая ошибка: неожиданно обнаружено ноль при развертывании необязательного значения
Я думал, это потому, что TableViewController
не был загружен при UIControls
вызове, поэтому я сначала попытался вызвать viewDidLoad()
из TableView, но ошибка все еще остается.
Что мне делать? Ценю любые предложения.
Комментарии:
1. Почему вы создаете экземпляр своего ViewController через
TableViewController.init(nibName: nil, bundle: nil)
, если вы определили его в storyboard? Для VC, определенного в раскадровке, вы должны использовать:-var storyboard = UIStoryboard(name: "Main", bundle: nil) var someViewController = storyboard.instantiateViewControllerWithIdentifier("SomeViewController") as! SomeViewController
2. @Aks Большое вам спасибо. Я не знал, что могу создать его таким образом. Ваше решение сработало с предложением Андреаса Этьена. Однако переменные UIControl, вызываемые ViewController, не меняют своего значения ни после нажатия UISwitch, ни UISegmentedControl в ViewController.
Ответ №1:
Вы не вызываете напрямую viewDidLoad
, это делается UIKit после загрузки представления. И представление загружается, когда его необходимо отобразить.
Если вам нужно получить доступ к выходам раньше, вы можете принудительно загрузить с помощью
tableView.loadViewIfNeeded()
Но помните:
- Может быть, лучше делать выходные данные внутри
viewDidLoad
задействованного контроллера, а не снаружи. - Вы не должны называть переменную контроллера
tableView
. Это имя предполагает, что это представление, а не контроллер. Лучше назовите этоtableViewCtrl
или так.