2017-07-06 78 views
2

Edit: Please note the question below discusses using delegation between 2 viewcontrollers that are also implemented in a UITabBarController.Swift代表團:意外地發現零,同時展開一個可選值

我已經在這裏和YouTube上進行了一些搜索,但沒有看到我的問題在其他地方複製。我會保持這一點。

我有編碼自己-not通過XCode-產生2個視圖控制器; TabOneController和TabTwoController

下面

對於兩個編碼...

import UIKit 

class TabOneController: UIViewController{ 


    private let instanceOfTabOneView = TabOneView() 

    var vc1Delegate: fromOneToTwo! 

    override func loadView() { 

     super.loadView() 

      view.addSubview(instanceOfTabOneView.buildTheVu()) 
       view.backgroundColor = UIColor.white 

     runThisOnce() 

     } 

    func runThisOnce(){ 

     vc1Delegate.passTheValue(heroNameIs: "pass this to TabTwoController") 

    } 

} 

protocol fromOneToTwo{ 

    func passTheValue(heroNameIs: String) 

} 

爲標籤2 ...

import UIKit 

class TabTwoController: UIViewController, fromOneToTwo{ 


    private let instanceOfTabTwoView = TabTwoView() 


    override func loadView() { 

     super.loadView() 

      view.addSubview(instanceOfTabTwoView.buildTheVu()) 

     assignDelegateToSelf() 

    } 

    func assignDelegateToSelf(){ 

     let instanceTabOne = TabOneController() 
      instanceTabOne.vc1Delegate = self 

    } 

    func passTheValue(heroNameIs:String){ 

     instanceOfTabTwoView.txtFld.text = heroNameIs 

    } 

} 

我得到以下運行時錯誤-The應用程序構建成功 - ...

fatal error: unexpectedly found nil while unwrapping an Optional value

onfollo翼行...

vc1Delegate.passTheValue(heroNameIs: "pass this to TabTwoController") 

當我註釋掉上面的行,應用程序構建和運行成功,但當然應用程序不執行的代表團。

我有點明白什麼是編譯器試圖告訴我,那

vc1Delegate 

尚未實例-I guess-。但我在每一塊岩石下搜尋,似乎無法找到如何解決這個問題。

我會很感激的任何幫助或指導。對不起,如果我的代碼看起來不成熟,我是Swift和編程的新手。謝謝。

回答

1

UITabBarController,所述第一接線片被默認實例。視圖控制器初始化執行loadView並且發現nil因爲第二片還不初始化;這是正常的行爲。我的建議是做委託弱可選與?後綴和其他地方運行委託代碼。另外,請始終將類和協議名稱中的第一個字母大寫。

weak var vc1Delegate: FromOneToTwo? 

如果這種結構是強制性的,嘗試用自定義通知觀察者來代替。

+0

感謝您的答覆。我將用2個常規ViewController創建一個Xcode項目,並用變量替換所有UI控件。如果UITabController是問題,我會發布另一條評論。謝謝你的時間。 –

1

首先,您的錯誤發生在var vc1Delegate: fromOneToTwo!行中,而您將此委託變量聲明爲非空,但對其調用passTheValue。正確的做法將是

var vc1Delegate: fromOneToTwo? 

func runThisOnce(){ 
    if let delegate = vc1Delegate { 
     vc1Delegate.passTheValue(heroNameIs: "pass this to TabTwoController") 
    } 
} 

其次,你沒有正確使用委託。在assignDelegateToSelf()函數中,您正在創建一個新實例TabOneController ,然後分配委託。相反,您需要找出現有的TabOneController實例並分配委託。

+0

如何找出現有的'TabOneController'實例? – Sebastian

+0

@Sebastian這取決於你的代碼如何寫入...如果你想要委託調用,你必須爲控制器註冊委託,然後你只能接收來自該控制器的委託調用。通常情況下,如果使用storyboard和正常的segue到新的視圖控制器,則不需要關心它,因爲您只有一個視圖控制器實例。但是,當您以編程方式創建視圖控制器(如從故事板功能調用初始化)時,則只需啓動一次並將該瞬間存儲在某處,以便稍後可以找到並接收呼叫。 –

+0

感謝您的解釋。我能夠做到這一點,當segue被觸發時,將當前的viewcontroller類保存在變量中,然後在該segue期間將該變量傳遞給其他視圖控制器 – Sebastian

相關問題