IOS-Swift开发基础——通知

区块链游侠
• 阅读 4765

NSNotificationCenter

NSNotificationCenter是专门供程序中不同类间的消息通信的。使用它为我们代码降低耦合。

自定义数据监听

  • 注册监听:

// addObserver 4个参数分别是:接受者对象,接受者处理函数,消息名称,发送者对象(通常设为nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(downloadImage), name: "NotificationName", object: nil)
  • 移除监听:

NSNotificationCenter.defaultCenter().removeObserver(self)
  • 监听函数:

func downloadImage(notification: NSNotification) {
    let userInfo = notification.userInfo as! [String: AnyObject]
    let value1 = userInfo["val1"] as! String
    let value2 = userInfo["val2"] as! Int
    // ...
}
  • 发送消息:

NSNotificationCenter.defaultCenter().postNotificationName("NotificationName",
            object: self, userInfo: ["val1":"msg1", "val2" : 123])

默认监听

  • addObserverForName监听方法

let operationQueue = NSOperationQueue.mainQueue()
// queue必须是处理队列NSOperationQueue,usingBlock是响应消息的函数闭包
NSNotificationCenter.defaultCenter().addObserverForName("NotificationName2", object: nil, queue: operationQueue, usingBlock: { /*...*/ })
  • postNotificationName

系统会发送很多消息,如:

UIApplicationDidEnterBackgroundNotification
UIApplicationWillEnterForegroundNotification
UIApplicationDidFinishLaunchingNotification
...

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(onKeyboardWillShow), name: UIKeyboardWillShowNotification, object: nil)     
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(onKeyboardWillHide), name: UIKeyboardWillHideNotification, object: nil)   
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(onEnterBackground), name: UIApplicationWillResignActiveNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(onEnterForeground), name: UIApplicationDidBecomeActiveNotification, object: nil)

发送不带数据的消息:

NSNotificationCenter.defaultCenter().postNotificationName("NotificationName2", object: self)

发送本地通知栏通知

  • 注册用户消息设置

可以设置在AppDelegate的didFinishLaunchingWithOptions内部

let settings = UIUserNotificationSettings(forTypes: [.Sound, .Alert, .Badge], categories: nil)
application.registerUserNotificationSettings(settings)

这样,安装后首次进入应用系统会提示是否允许接收通知。

  • 发送消息

获取一个UILocalNotification
发送:UIApplication.sharedApplication().presentLocalNotificationNow(notification)

let notification = UILocalNotification()
notification.fireDate = NSDate().dateByAddingTimeInterval(3) // 延迟3秒发送消息
notification.timeZone = NSTimeZone.localTimeZone()
notification.repeatInterval = NSCalendarUnit.Minute // 设置每分钟重复一次
notification.alertTitle = "This is a notification title"
notification.alertBody = "This is a notification body"
notification.alertAction = "OK"
notification.soundName = UILocalNotificationDefaultSoundName  // 默认提示音
notification.applicationIconBadgeNumber = 1  // 应用Icon的悬浮数字
// 使用userInfo数据
var userInfo:[NSObject : AnyObject] = [NSObject : AnyObject]()
userInfo["kLocalNotificationID"] = "LocalNotificationID"
userInfo["key"] = "Attention Please"
notification.userInfo = userInfo

UIApplication.sharedApplication().scheduleLocalNotification(notification)
// 如果不延时就现在发送
// UIApplication.sharedApplication().presentLocalNotificationNow(notification)
  • 处理消息

当我们在系统通知栏里点击到我们的通知,跳转到应用时,系统会触发
application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification)
我们就在下面写我们的处理逻辑

print("didReceiveLocalNotification \(notification.alertTitle)")

let userInfo = notification.userInfo!
let title = userInfo["key"] as! String

let alert = UIAlertController(title: title, message: notification.alertBody, preferredStyle: UIAlertControllerStyle.Alert)
alert.title = title
alert.message = notification.alertBody
let okAction = UIAlertAction(title: "OK!!!", style: UIAlertActionStyle.Default, handler: nil)
alert.addAction(okAction)
self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
  • 清除Icon的通知数字

我们在应用激活状态,就去清除掉数字
应用别激活就会调用:
applicationDidBecomeActive(application: UIApplication)

application.cancelAllLocalNotifications()
application.applicationIconBadgeNumber = 0
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Stella981 Stella981
3年前
KaliTools说明书+BurpSuit实战指南+SQL注入知识库+国外渗透报告
!(https://oscimg.oschina.net/oscnet/d1c876a571bb41a7942dd9752f68632e.gif"15254461546.gif")0X00KaliLinux Tools中文说明书!(https://oscimg.oschina.net/oscnet/
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
区块链游侠
区块链游侠
Lv1
人生到处知何似,应似飞鸿踏雪痕。泥上偶然留指爪,鸿飞哪复计西东。
文章
6
粉丝
0
获赞
0