Swift无法通过委托调用协议方法

时间:2016-05-15 23:30:55

标签: ios swift macos delegates protocols

我有两节课。一个类名为ViewController,另一个类名为TabView

我的目标是从ViewController中调用TabView类中的函数changeTab()

不知怎的,我遇到了麻烦,因为每次我的代表都是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 个答案:

答案 0 :(得分: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")
    }
}

答案 1 :(得分:0)

您正在此行中创建一个新实例:

let myVC = ViewController()

你应该获得ViewController的现有实例。然后设置

myVC.delegateCustom = self