Сбой при 'неожиданно найденном nil при развертывании необязательного' в методе setTitle UISegmentedControl

У меня есть sourceViewController, который обращается к UISegmentedControl в destinationViewController. EventType перечисление определяется как:

enum EventType: Int {
    case Rashifal, RashiGyan
}

Название segmentedControl в destinationViewController должно меняться в зависимости от изменения значения segmentedControl в sourceViewController.

Всякий раз, когда в sourceViewController нажимается segmentedControl, изменяется значение, как я напечатал в консоли. Теперь я хочу изменить содержание segmentedControl в destinationViewController в соответствии с ранее выбранным segmentedControl значение в моем sourceViewController.

Значение segmentedControl в destinationViewController отлично работает при первом запуске и, как и ожидалось, но когда я перехожу к своему sourceViewController и меняю segmentedControl и перехожу к destinationViewController, происходит сбой с сообщением Fatal error: unexpectedly found nil while unwrapping an Optional value в консоли.

Вот как я пытался изменить значение моего segmentedControl в destinationViewController из sourceViewController.

 @IBAction func segmentedControlValueChanaged(_ sender: UISegmentedControl) {
    let eventType = EventType(rawValue: sender.selectedSegmentIndex)!

    let anotherVC = UIStoryboard(name: "Rashifal", bundle: nil).instantiateViewController(withIdentifier: "RashiDetailVC") as? RashiDetailVC
    switch eventType {
    case .Rashifal:
        print("at Rashifal")
        anotherVC?.segmentedControl.setTitle("दैनिक", forSegmentAt: 0)
        anotherVC?.segmentedControl.setTitle("साप्ताहिक", forSegmentAt: 1)
        anotherVC?.segmentedControl.setTitle("मासिक", forSegmentAt: 2)
        anotherVC?.segmentedControl.setTitle("वार्षिक", forSegmentAt: 3)
    case .RashiGyan:
        print("At RashiGyan")
        anotherVC?.segmentedControl.setTitle("विशेषता", forSegmentAt: 0)
        anotherVC?.segmentedControl.setTitle("शुभ/अशुभ", forSegmentAt: 1)
        anotherVC?.segmentedControl.setTitle("प्रेम", forSegmentAt: 2)
        anotherVC?.segmentedControl.setTitle("जीवन", forSegmentAt: 3)
    }

}

Что могло пойти не так?

1 ответ

Решение

Для передачи данных в виртуальный канал, который вы собираетесь показывать, не используйте instantiateViewController метод. Это даст вам новый VC, а не тот, который будет представлен.

Сначала создайте переменную с именем eventType в контроллере назначения:

var eventType: EventType!

Override prepareForSegue в источнике ВК:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // make segmentedControl as an IBOutlet if you haven't done already
    let eventType = EventType(rawValue: segmentedControl.selectedSegmentIndex)!
    if let vc = segue.destination as? RashiDetailVC {
        vc.eventType = eventType
    }
}

В пункте назначения ВК viewDidLoad, сделайте оператор switch:

        switch eventType {
        case .Rashifal:
            print("at Rashifal")
            segmentedControl.setTitle("दैनिक", forSegmentAt: 0)
            segmentedControl.setTitle("साप्ताहिक", forSegmentAt: 1)
            segmentedControl.setTitle("मासिक", forSegmentAt: 2)
            segmentedControl.setTitle("वार्षिक", forSegmentAt: 3)
        case .RashiGyan:
            print("At RashiGyan")
            segmentedControl.setTitle("विशेषता", forSegmentAt: 0)
            segmentedControl.setTitle("शुभ/अशुभ", forSegmentAt: 1)
            segmentedControl.setTitle("प्रेम", forSegmentAt: 2)
            segmentedControl.setTitle("जीवन", forSegmentAt: 3)
        }

Это гарантирует, что сегментированный элемент управления был инициализирован до того, как вы установили его заголовок.

Другие вопросы по тегам