在 UISegmentedControl setTitle 方法上使用 'unexpectedly found nil while unwrapping an optional' 崩溃
Crashing with 'unexpectedly found nil while unwrapping an optional' on UISegmentedControl setTitle method
我有一个 sourceViewController,它正在访问 destinationViewController 中的 UISegmentedControl
。 EventType
是一个枚举,定义为:
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)
}
这样可以确保分段控件在设置标题之前已经初始化。
我有一个 sourceViewController,它正在访问 destinationViewController 中的 UISegmentedControl
。 EventType
是一个枚举,定义为:
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)
}
这样可以确保分段控件在设置标题之前已经初始化。