Swift: UIControl в TableViewController обнаружил ноль при вызове ViewController

#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 или так.