2017-06-06 57 views
0

上發生意外發現零而意外發現零,同時展開可選項我有一個sourceViewController正在訪問destinationViewController中的UISegmentedControlEventType是定義爲一個枚舉:在UISegmentedControl setTitle方法

enum EventType: Int { 
    case Rashifal, RashiGyan 
} 

segmentedControl對destinationViewController標題應根據segmentedControl對sourceViewController值的變化而變化。

只要在sourceViewController中點擊segmentedControl,就會看到已更改的值,因爲我已在控制檯中打印。現在,我想根據之前在我的sourceViewController中選擇的segmentedControl值在destinationViewController中更改segmentedControl的內容。

segmentedControl在destinationViewController價值工程在第一次運行很好,符合市場預期,但是當我瀏覽到我的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) 
    } 

} 

什麼可能會出錯?

+0

您是否在故事板中呈現了RashiDetailVC與segue? – Sweeper

+0

這是一個好故事的故事板segue。 – amagain

+0

這是因爲你剛剛拿到了控制器對象,它的屬性還沒有初始化,當viewDidload或viewwillappear方法會調用時,它們將被初始化!這就是爲什麼segmentedControl對象爲零 要刪除它,爲什麼不在控制器viewDidload或viewwilla控制器的方法上設置這些段控制值。 –

回答

1

要將數據傳遞給您要顯示的VC,請不要使用instantiateViewController方法。這會給你一個新的 VC,而不是將要呈現的那個。

首先,做一個在目標控制器稱爲eventType變量:在源VC

var eventType: EventType! 

覆蓋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) 
     } 

這確保在設置標題之前,分段控件已經初始化。

+0

沒有崩潰,但目前在destinationViewController segmentedControl中沒有值更改。 – amagain

+0

@amagain請參閱編輯答案。 – Sweeper