Сбой при 'неожиданно найденном 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)
}
Это гарантирует, что сегментированный элемент управления был инициализирован до того, как вы установили его заголовок.