首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift不能通过委托调用协议方法

Swift不能通过委托调用协议方法
EN

Stack Overflow用户
提问于 2016-05-15 23:30:55
回答 2查看 6.6K关注 0票数 1

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

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

不知怎么的,我在这方面有困难,因为每次我的代表都是nil

这里是我的ViewController:代码

代码语言:javascript
复制
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:代码

代码语言:javascript
复制
class TabView: NSTabViewController, TabViewProtocol {

    let myVC = ViewController()

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

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

有人能解释我做错了什么吗?-我对代表和协议不熟悉.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-16 01:00:33

您错误地使用了委托模式。很难说您想要为哪个控制器定义协议,以及您想采用哪个控制器--但这里有一种可能的方法。

代码语言:javascript
复制
// 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")
    }
}
票数 7
EN

Stack Overflow用户

发布于 2016-05-16 06:10:11

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

代码语言:javascript
复制
let myVC = ViewController()

您应该获得ViewController.then集的现有实例。

代码语言:javascript
复制
myVC.delegateCustom = self
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37244758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档