2016-12-16 3 views
0

私はかなりの質問を読んでこの問題は解決しません。一部はOjective C用です。一部はiOS向けです。私が必要とするものに近いものはうまくいかなかった。ビューコントローラリファレンスの取得

私は委任のためのプロトコルを設定しました。それは動作しません。問題は、代理変数が設定されていないことです。アクティブなコントローラへの参照が必要です。

委任

protocol SwitchTabDelegate: class { 
    func selectTab(tab: Int) 
} 

class ViewController: NSViewController { 

    weak var delegate: SwitchTabDelegate? 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    } 

    @IBAction func selectCompositions(_ sender: NSButton) { 

    if let delegate = self.delegate { 
     delegate.selectTab(tab: 2) 
    } 
    else { 
     print("self.delegate is nil") 
    } 
    print("delegate called") 
    } 
} 

委譲

class TabViewController: NSTabViewController, SwitchTabDelegate { 

    var viewController : ViewController?; 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    //viewController = storyboard?.instantiateController(withIdentifier: "viewController") as? ViewController 
    // viewController?.delegate = self 
    // print(viewController) 
    } 

    func selectTab(tab: Int) { 
    print("In the delegate") 
    switchToDataTab() 
    } 

    func switchToDataTab() { 
    Timer.scheduledTimer(timeInterval: 0.2, target: self, 
     selector: #selector(switchToDataTabCont), 
     userInfo: nil, repeats: false) 
    } 

    func switchToDataTabCont(){ 
    self.selectedTabViewItemIndex = 2 
    } 
} 

委譲メインNSViewContollerあります。ストーリーボード上には、2つのボタンとコンテナビューコントローラがあります。コンテナビューコントローラには、delegateeであるTabViewControllerが埋め込まれています。あなたは私が参照を取得しようとしたdelegateeで見ることができます。おそらく、新しくインスタンス化されたインスタンスへの参照を取得します。アプリケーションの起動時にスピンアップされた元のView Controllerへの参照が必要です。

回答

私は委任者に次のコードを追加しました:

override func prepare(for segue: NSStoryboardSegue, sender: Any?) { 

    let controller = segue.destinationController as! TabViewController 
    self.delegate = controller as SwitchTabDelegate 
} 

それがデザインパターン、次の動作するはずかではありません。委任者は、委任者の知識がないはずです。私は、この問題ではあまりにも多くの時間を費やしてしまったので、ハックがやりそうです。

答えて

0

ストーリーボードを使用しているときは、子供が作成されたときに参照をアップストリームコントローラーから引き出すのではなく、「プッシュ」する必要があります。これは、-prepareForSegue:sender:が使用される理由です。

+0

親と子の間のプロトコルを使用するのは不適切ですか?私はprepareForSegueの例を見つけ、それを私のコードに入れました。それは決して実行されませんでした。この例には「続編」コードはありませんでした。私は元の質問に私が持っているものを追加します。 – curt

+0

セグを使用して問題を解決しました。私は親の子参照を引っ張ったので私の議定書を守りたいと思っていました。 – curt