2016-12-16 16 views
0

Я прочитал довольно много вопросов и ответов, нет этой проблемы. Некоторые из них относятся к Ojective C. Некоторые из них относятся к iOS. Те, которые были близки к тому, что мне нужно, не работали.Получение справки контроллера View

Я установил протокол для делегирования. Это не работает. Проблема в том, что переменная делегата не задана. Мне нужна ссылка на активный контроллер.

доверителя

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") 
    } 
} 

Delegatee

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 
    } 
} 

delegatee является основным NSViewContoller. На раскадровке он содержит две кнопки и контроллер представления контейнера. Встроенным в контроллере контейнера является TabViewController, делегат. Вы можете видеть в делегатете, где я пытался получить ссылку. Он получает ссылку, предположительно, на вновь созданный экземпляр. Мне нужна ссылка на исходный контроллер представлений, который был развернут при запуске приложения.

Ответ

Я добавил следующий код доверителя:

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

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

Это не так, как она должна работать после шаблона проектирования. Делегат не должен знать делегата. Я потратил слишком много времени на эту проблему, так что взломать будет.

ответ

0

При использовании раскадровки вы хотите «нажать» ссылки на детей, когда они созданы, или вытащить их из контроллера восходящего потока. Это то, что -prepareForSegue: отправитель: используется для.

+0

Так что использование протокола между родителем и дочерним является неуместным? Я нашел пример prepareForSegue и поместил его в свой код. Он никогда не исполнялся. В примере не было кода «сделать сиквел». Я добавлю то, что у меня есть к исходному вопросу. – curt

+0

С помощью segue исправлена ​​проблема. Я хотел сохранить протокол, поэтому я привязал дочернюю ссылку к родительскому элементу. – curt