iOS Swift delegate的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS Swift delegate的使用相关的知识,希望对你有一定的参考价值。

参考技术A 实现不同组件间传值

比如A中改变了某个属性的值,在改变的同时要B要做出相应的变化,此时就可以用代理。

A、B 可以是ViewController,也可以是UIView和任何类和结构体。

首先,定义一个 协议 protocol, 继承自NSObjectProtocol,在其中定义方法。(这里很像接口的定义,更像是android中MVP中对P的定义)

其次,在A中添加一个 继承自这个协议的弱引用属性,weak是为了避免循环引用等问题。

然后,B要继承自这个协议,并实现协议中定义的方法。

最后, B中要有A类的实例,才可以建立代理

这样就基本上算是建立了代理
那么,当有一个时机来改变A中的属性的值的时候,就可以用了(这里主要是用index做示范,如果要传递不同的数据,需要在定义协议中的方法里构建好函数的参数)
例如,点击事件是触发时机时

当点击事件调用时,会通过delegate调用回调方法。 即调用 B 中实现的 callback 方法。

即在A中是某个时机下,让B执行某个方法。

一般用于界面间的反向传值。

Swift语言精要 - 浅谈代理模式(Delegate)

在iOS编程中,我们经常谈到代理代理,也就是delegate,那么什么是代理呢?

我们来看一下cocoa对它的描述:

Delegation is Cocoa’s term for passing off some responsibilities of an object to another

顾名思义:

代理是把职责从一个对象传到另一个对象。

其实,如果编写过Java或者C#程序的朋友应该知道,我们在设计的时候经常使用到接口和组合,道理是一样的。

看一下下面的代码:

 

首先,我们定义一个协议

protocol SaveMediaDelegate {
    func save()
}

 

然后,我们把这个协议组合到我们的业务逻辑类中去

class MyComputer {
    var delegate : SaveMediaDelegate?
    
    func saveInfo() {
      // Check to see if the delegate is there, then call it
      delegate?.save()
    }
}

 

接着,我们实现协议的不同表现形态

class SaveToDisk : SaveMediaDelegate {
    func save() {
        println("Saving to disk...")
    }
}

class SaveToUsb : SaveMediaDelegate {
    func save() {
        println("Saving to usb...")
    }
}

 

然后,我们把我们的协议实现类注入到我们的业务类中去(DI - Dependency Injection)

let myComputer = MyComputer()
myComputer.saveInfo() // does nothing

let diskMedia = SaveToDisk()
myComputer.delegate = diskMedia
myComputer.saveInfo() // prints "Saving to disk..."

let usbMedia = SaveToUsb()
myComputer.delegate = usbMedia
myComputer.saveInfo() // prints "Saving to usb..."

 

很简单吧,就是这么简单!

 

以上是关于iOS Swift delegate的使用的主要内容,如果未能解决你的问题,请参考以下文章

Swift/iOS13 - UIApplication.shared.delegate.window?.rootViewController?.present() 来自自定义类

Google Sign In 调用 App Delegate 中的方法后关闭 View Controller (iOS / Swift)

Swift语言精要 - 浅谈代理模式(Delegate)

IOS 如何选择delegatenotificationKVO?

iOS/Swift:InAppPurchase invalidProductIdentifiers

objc 中 id<delegate>这个类型在swift中怎么写