2016-12-16 144 views
0

我閱讀了很多問題並沒有回答這個問題。一些是針對目標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。在故事板上,它包含兩個按鈕和一個Container視圖控制器。嵌入在容器視圖控制器中的是TabViewController,即代理人。你可以在委託人看到我試圖獲得參考的地方。它確實獲得了一個引用,可能是新實例化的實例。我需要對應用程序啓動時啓動的原始視圖控制器的引用。

回答

我下面的代碼添加至委託:

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

使用segue修復了這個問題。我想保留我的協議,所以我把孩子的引用拉到父母身上。 – curt

相關問題