2016-05-15 9 views
-1

aufrufen Ich habe zwei Klassen. Eine Klasse heißt ViewController und die andere Klasse heißt TabView.Swift kann Protokollmethode nicht über Delegat

Mein Ziel ist es, eine Funktion changeTab() aufrufen, die in der TabView-Klasse von ViewController ist.

Irgendwie habe ich Probleme damit, weil mein Delegierter immer nil ist.

Hier ist mein Code für 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 
    } 
} 

Hier ist mein Code für TabView:

class TabView: NSTabViewController, TabViewProtocol { 

    let myVC = ViewController() 

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

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

Kann mir jemand erklären, was ich falsch mache? - Ich bin neu für Delegierte und Protokolle ...

+2

Sie sind immer eine neue 'ViewController' Schaffung über 'ViewController()' - dieser neue Controller hat wahrscheinlich nichts mit dem Rest der App zu tun. Sie müssen eine Verbindung zwischen den beiden Instanzen haben - keine neuen Instanzen erstellen. Im Allgemeinen sollte dies mit dem Interface Builder leicht möglich sein. – luk2302

+0

Meine Antwort wurde aktualisiert. Dies ist, wie ich es vorher hatte ... funktioniert auch nicht – Anokrize

+0

Und es funktioniert nicht über den InterfaceBuilder, weil ich es nicht verwende. @ luk2302 – Anokrize

Antwort

5

Sie verwenden das Delegatenmuster falsch. Es ist schwer zu sagen, für welchen Controller Sie das Protokoll definieren möchten und welchen Sie es übernehmen möchten - aber hier ist eine Möglichkeit.

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

Sie eine neue Instanz in dieser Linie zu schaffen:

let myVC = ViewController() 

sollten Sie erhalten bestehende Instanz Ihrer ViewController.then gesetzt

myVC.delegateCustom = self