【问题标题】:Swift 3 Delegate function not calledSwift 3委托函数未调用
【发布时间】: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 以将委托作为参数而不是之后将其分配为属性。

标签: ios xcode swift3 delegates swift-playground


【解决方案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 方法并将该行复制到其中? (对不起,我不知道如何使它更简单,也不知道什么让你感到困惑。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2021-05-31
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    相关资源
    最近更新 更多