在 UISegmentedControl setTitle 方法上使用 'unexpectedly found nil while unwrapping an optional' 崩溃

Crashing with 'unexpectedly found nil while unwrapping an optional' on UISegmentedControl setTitle method

我有一个 sourceViewController,它正在访问 destinationViewController 中的 UISegmentedControlEventType 是一个枚举,定义为:

enum EventType: Int {
    case Rashifal, RashiGyan
}

destinationViewController的segmentedControl的title会随着sourceViewController的segmentedControl的值的变化而变化

只要在 sourceViewController 中点击 segmentedControl,就会看到更改的值,正如我在控制台中打印的那样。现在,我想根据我的 sourceViewController 中先前选择的 segmentedControl 值更改 destinationViewController 中 segmentedControl 的内容。

destinationViewController 中 segmentedControl 的值在第一个 运行 上正常工作,正如预期的那样,但是当我导航到我的 sourceViewController 并更改 segmentedControl 并导航到 destinationViewController 时,发生崩溃并显示消息Fatal error: unexpectedly found nil while unwrapping an Optional value 在控制台中。

以下是我尝试从 sourceViewController 更改 destinationViewController 中的 segmentedControl 值的方法。

 @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)
    }

}

可能出了什么问题?

要将数据传递给要显示的 VC,请不要使用 instantiateViewController 方法。这会给你一个 new VC,而不是将要呈现的那个。

首先,在目标控制器中创建一个名为 eventType 的变量:

var eventType: EventType!

覆盖源 VC 中的 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
    }
}

在目标 VC 的 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)
        }

这样可以确保分段控件在设置标题之前已经初始化。