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
}
這不是它應該如何工作後的設計模式。代表應該不知道受託人。我在這個問題上花了太多時間,所以黑客正在做。
因此,在父母和孩子之間使用協議是不恰當的?我確實找到了prepareForSegue的例子,並將其放入我的代碼中。它從未被執行過。該示例沒有「做續集」代碼。我會添加我原來的問題。 – curt
使用segue修復了這個問題。我想保留我的協議,所以我把孩子的引用拉到父母身上。 – curt