Swift 3委托函数未调用

Posted

技术标签:

【中文标题】Swift 3委托函数未调用【英文标题】:Swift 3 Delegate function not called 【发布时间】:2017-09-27 17:19:15 【问题描述】:

我正试图了解 Swift 委托并偷走/敲掉 Playground,但似乎无法调用委托函数。

protocol fBookDelegate:class 
    func processData(data: String)


class fBook 

weak var delegate: fBookDelegate?

init() 
    print("initialising fBook")
    delegate?.processData(data: "hello world")
    print("we should have printed")
    


class fMain: fBookDelegate 
init() 
    print("initialising fMain")
    let getfBook = fBook()
    getfBook.delegate = self
    print("all done let's rumble")
    

func processData(data: String) 
    print("processing data from fBook with \(data)")
    


var controller = fMain()

有人能看出我的错误吗?

我得到的只是输出

initialising fMain
initialising fBook
we should have printed
all done let's rumble

【问题讨论】:

您尝试在 fBook 的 init 中使用委托,但直到您初始化对象后才设置它。 修改 fBook init 以将委托作为参数而不是之后将其分配为属性。 【参考方案1】:

你可以这样使用:

import UIKit
protocol fBookDelegate:class 
    func processData(data: String)

class fBook 
    init(delegate: fBookDelegate?) 
        print("initialising fBook")
        delegate?.processData(data: "hello world")
        print("we should have printed")
    

class fMain: fBookDelegate 
    init() 
        print("initialising fMain")
        let getfBook = fBook(delegate: self)
        print("all done let's rumble")
    
    func processData(data: String) 
        print("processing data from fBook with \(data)")
    


var controller = fMain()

输出:

initialising fMain
initialising fBook
processing data from fBook with hello world
we should have printed
all done let's rumble

【讨论】:

【参考方案2】:

这是使用您的委托的一种选择:

protocol fBookDelegate:class 
    func processData(data: String)


class fBook 

    weak var delegate: fBookDelegate?

    init() 
        print("initialising fBook")
    

    func talkToMe() 
        delegate?.processData(data: "hello world")
    


class fMain: fBookDelegate 
    init() 
        print("initialising fMain")
        let getfBook = fBook()
        getfBook.delegate = self
        getfBook.talkToMe()
        print("all done let's rumble")
    

    func processData(data: String) 
        print("processing data from fBook with \(data)")
    


var controller = fMain()

另一种是将委托作为参数的自定义 init 方法。

【讨论】:

好吧,也许我不理解 Delegates,但理想情况下,我希望在例如单击按钮或点击表格时从 fBook 调用它。然后对象/数据/字符串从 fBook 发送到 fMain,我可以在其中更新 UI。我是不是走错了路? 这听起来不错。基本上,您接下来要做的就是用某种 IBAction 方法替换 talkToMe,该方法可以响应您要处理的事件类型。不过,我的观点是,您需要在使用之前设置委托,或者 - 如您所见 - 没有任何反应。 请确保您的对象范围也是正确的。如果你想让fBookfMain 完成它的init 之后做一些事情,那么必须有一些东西让它保持活力。 还是不明白 - 这一点 getfBook.talkToMe() 只是在 fBook 中调用一个函数,所以我如何将 delegate?.processData 移动到 IBAction ? 在 fBook 中创建 IBAction 方法并将该行复制到其中? (对不起,我不知道如何使它更简单,也不知道什么让你感到困惑。)

以上是关于Swift 3委托函数未调用的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePickerController 委托未调用 Swift 3

未调用 BLE 外设委托

UItextView 委托 swift - textViewDidBeginEditing 未调用

swift 1.2 / xcode 6.3 更新后未调用获取的结果控制器委托

使用 iOS 和 Swift 3 在委托方法中未接收到 xmpp 存在

Swift TextField 方法未调用,委托已设置,现在 BAD_ACCESS 错误