Github还没上传,先用着Dropbox(可能要),看完有收获的感谢点个赞,如果翻不了墙要代码可以私聊我
https://www.dropbox.com/sh/wbo7lwpphi8ibn9/AAAWxUOj0PRKDlTNfpPz_A11a?dl=0
dropbox代理通知block的使用
一、定义一套公用的接口(Public)
@required:必须实现的方法
在这里插入代码片
@optional:可选实现的方法(可以全部都不实现)
// Swift中如何定义协议: 必须遵守NSObjectProtocol
protocol TextViewControllerDelegate: NSObjectProtocol{
// 点击delegate按钮回调
func delegateBtnWillClick(message : String)
}
委托代理(Delegate)传值:
它本身是一个设计模式,它的意思是委托别人去做某事。
比如:两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A,这时候我们需要用到代理(Delegate)。
(对象).delegate=self的意思就是对象的任务交给self去做
//定义一个属性保存代理,一定要加weak,避免循环引用
weak var delegate: TextViewControllerDelegate?
代理: 1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;
2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败 (will, now,did)
//MARK: - 按钮点击方法,跳转界面
@objc func pushBtnClick()
{
print("delegate")
//设置此控制器为代理
text.delegate = self
self.navigationController?.pushViewController(text, animated: true)
}
//MARK: - 代理方法
func delegateBtnWillClick(message: String) {
print(message)
}
}
//MARK: - 点击代理传值按钮
@objc func delegateBtnClick()
{
print("代理传值按钮被点击")
let str = "代理传值按钮被点击,把上个界面的值传了过来"
delegate?.delegateBtnWillClick(message: str)
self.navigationController?.popViewController(animated: true)
}
1:写法更简练,不需要写protocol、函数等等
2,block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
3,block需要注意防止循环引用
4,使用 block 的代码通常会在同一个地方
//内置类型为block的btnclick
typealias blockBtnClickSendValue = (_ message: String)->Void
@objc func blockBtnClick()
{
print("闭包传值按钮被点击")
if block != nil
{
block!("闭包传值按钮被点击,把上个界面的值传了过来")
}
self.navigationController?.popViewController(animated: true)
}
textVC.myblock = {
(message:String) -> Void in
print("\(message)")
}
优先使用 block。而有两个情况可以考虑 delegate。
有多个相关方法。假如每个方法都设置一个 block, 这样会更麻烦。而 delegate 让多个方法分成一组,只需要设置一次,就可以多次回调。当多于 3 个方法时就应该优先采用 delegate。
在 swift 中,利用 enum, 多个方法也可以合并成一个 block 接口。
delegate 的方法是分离开的,并不会引用上下文,因此会更安全些。
通知的使用特点:一对多传值,控制器与控制器之间可以没有关联
delegate的形式只能是一对一,不能实现一对多。
设置rawvalue、Notification.name
let notificationBtnWillClick = "notificationBtnWillClick"
发送通知,如果通知中需要传值的话,在发出的通知中,加入userinfo,格式为字典.
let dict = ["action":"通知传值按钮被点击,把上个界面的值传了过来"]
NotificationCenter.default.post(name: NSNotification.Name(notificationBtnWillClick), object: self, userInfo: dict)
监听通知(接收通知)
//监听通知
NotificationCenter.default.addObserver(self, selector: #selector(receiveNotification(_ :)), name: NSNotification.Name(rawValue: notificationBtnWillClick), object: nil)
移除通知
//MARK: - 注销通知,deinit相当于OC中的dealloc方法
deinit
{
NotificationCenter.default.removeObserver(self)
}
A和B是两个不相干的关系,A不知道B,B也不知道A,那么这时候如果通过delegate就没办法做到,会相对复杂。所以可以通过NSNotifcation去做一些消息传递。
类似于键盘弹出事件
UNUserNotificationCenter(本地通知头部弹窗)