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
,该方法可以响应您要处理的事件类型。不过,我的观点是,您需要在使用之前设置委托,或者 - 如您所见 - 没有任何反应。
请确保您的对象范围也是正确的。如果你想让fBook
在fMain
完成它的init
之后做一些事情,那么必须有一些东西让它保持活力。
还是不明白 - 这一点 getfBook.talkToMe() 只是在 fBook 中调用一个函数,所以我如何将 delegate?.processData 移动到 IBAction ?
在 fBook 中创建 IBAction 方法并将该行复制到其中? (对不起,我不知道如何使它更简单,也不知道什么让你感到困惑。)以上是关于Swift 3委托函数未调用的主要内容,如果未能解决你的问题,请参考以下文章
UIImagePickerController 委托未调用 Swift 3
UItextView 委托 swift - textViewDidBeginEditing 未调用
swift 1.2 / xcode 6.3 更新后未调用获取的结果控制器委托