2016-05-15 2 views
-1

У меня есть два класса. Один класс называется ViewController, а другой класс - TabView.Swift не может вызвать метод протокола через делегат

Моя цель - вызвать функцию changeTab(), которая находится внутри класса TabView из ViewController.

Как-то у меня возникают проблемы с этим, потому что каждый раз мой делегат nil.

Вот мой код ViewController:

protocol TabViewProtocol: class { 
    func changeTab() 
} 

class ViewController: NSViewController { 
    // delegate 
    weak var delegateCustom : TabViewProtocol? 

    override func viewDidLoad() { 
     print(delegateCustom) // outputs "nil" 
    } 

    buttonClickFunction() { 
     print(delegateCustom) // outputs "nil" 
     delegateCustom?.changeTab() // doesn't work 
    } 
} 

Вот мой код TabView:

class TabView: NSTabViewController, TabViewProtocol { 

    let myVC = ViewController() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     myVC.delegateCustom = self 
    } 

    func changeTab() { 
     print("test succeed") 
    } 
} 

Может кто-нибудь объяснить мне, что я делаю неправильно? - Я новичок в делегатах и ​​протоколах ...

+2

Вы всегда создает новую 'ViewController' через 'ViewController()' - что новый контроллер, вероятно, не имеет никакого отношения к остальной части приложения. Вы должны иметь некоторую связь между двумя экземплярами - не создавать новые экземпляры. Как правило, это должно быть легко выполнимо с помощью конструктора интерфейса. – luk2302

+0

Обновлен мой ответ. Так было у меня раньше ... Не работает – Anokrize

+0

И он не работает через интерфейс, потому что я его не использую. @ luk2302 – Anokrize

ответ

5

Вы неправильно используете шаблон делегата. Трудно сказать, какой контроллер вы хотите определить для протокола и какой из них вы хотите принять, но вот один из возможных способов.

// 1. Define your protocol in the same class file as delegate property. 
protocol TabViewProtocol: class { 
    func changeTab() 
} 

// 2. Define your delegate property 
class ViewController: NSViewController { 
    // delegate 
    weak var delegateCustom : TabViewProtocol? 

    override func viewDidLoad() { 
     // It should be nil as you have not set the delegate yet. 
     print(delegateCustom) // outputs "nil" 
    } 

    func buttonClickFunction() { 
     print(delegateCustom) // outputs "nil" 
     delegateCustom?.changeTab() // doesn't work 
    } 
} 

// 3. In the class that will use the protocol add it to the class definition statement 

class TabView: NSTabViewController, TabViewProtocol { 

    let myVC = ViewController() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     myVC.delegateCustom = self 

     // Should output a value now 
     print(myVC.delegateCustom) // outputs "self" 
    } 

    func changeTab() { 
     print("test succeed") 
    } 
} 
0

вы создаете новый экземпляр в этой строке:

let myVC = ViewController() 

вы должны получить существующий экземпляр вашего ViewController.then установить

myVC.delegateCustom = self 
Смежные вопросы