[Swift实际操作]八、实用进阶-(7)使用通知的方法进行对象间的消息传递

本文将为你演示,如何使用Notification Center进行消息的传递。
通知中心是一个调度消息通知的类,采用单例设计模式,实现数据传递,回调等功能。
首先打开自定义视图的代码文件(CustomView.swift)

 1 import UIKit
 2 //使当前的自定义类,遵循文本输入框代理协议
 3 class CustomView: UIView,UITextFieldDelegate{
 4 //给自定义类添加一个文本框类型的属性
 5     var textField: UITextField!
 6 
 7 //重写初始化方法,
 8     override init(frame: CGRect)
 9     {
10        super.init(frame: frame)
11 //接着对文本框属性进行初始化,并设置它的显示区域
12        textField = UITextField(frame:CGRect(x: 0,
13                                             y: 0,
14                                         width: self.frame.size.width,
15                                        height: self.frame.size.height))
16 //设置文本框字体大小
17         textField.font = UIFont.boldSystemFont(ofSize: 14)
18 //设置文本框字体颜色
19         textField.textColor = .purple
20 //设置文本框投影颜色
21         textField.layershadowColor = UIColor.black.cgColor
22 //设置文本框投影偏移距离
23         textField.layershadowOffset = CGSize(width: 0.0,height: 3.0)
24 //设置文本框的不透明度
25         textField.shadowOpacity = 0.45
26 //设置阴影的半径大小
27          textField.shadowRadius = 3
28 //设置文本框大背景颜色
29          textField.backgroundColor = .lightGray
30 //设置文本框的代理对象
31          textField.delegate = self
32 
33 //将文本框添加到自定义视图之中
34          self.addSubview(textField)
35       }
36 
37 //实现文本框代理协议中的方法,用来监听键盘上的回车键被按下的事件
38      func textFieldShouldReturn(_ textField: UITextField) -> Bool
39      { 
40 //获得通知中心的单例对象,发送一条指定名称的通知,
41 //并设置通知中心传递的数据为空。
42          NotificationCenter.default.post(name: NSNotification.Name(rawValue:"checkFormNotification"),
43                                  object: nil, 
44                                      userInfo: nil)
45          return true    
46        }
47 
48 //需要实现指定的初始化方法
49     required init?(coder aDecoder: NSCoder)
50     {
51         fataError("init(coder:) has not been implemented")
52      }
53 
54      override func didReciveMemoryWarning(){
55           super.didReceiveMemoryWarning()
56 
57      }
58 }

然后在左侧的项目导航区,打开视图控制器的代码文件(ViewController.swift)

 1 import UIKit
 2 
 3 class ViewController: UIViewController{
 4 //添加两个自定义视图类型的属性
 5      var nameField: CustomView! 
 6      var passwordField: CustomView! 
 7 //添加一个提交按钮,当点击该按钮时,提交整个表单。
 8      var submitButton: UIButton!    
 9 
10      override func viewDidLoad(){
11          super.viewDidLoad()
12 
13 //初始化两个整形常量,作为自定义视图的宽度和高度
14          let wid = Int(self.view.frame.size.width) - 40
15          let hei = 40
16 
17 //然后对第一个自定义视图属性进行初始化,并设置它的显示区域
18          nameField = CustomView(frame: CGRect(x: 20,y: 80,with: wid,height: hei))
19 
20 //对第二个自定义视图属性进行初始化,并设置它的显示区域
21          passwordField= CustomView(frame: CGRect(x: 20,y: 140,with: wid,height: hei))
22 
23 //初始化提交按钮属性,并设置它的显示区域
24          submitButton = UIButton(frame: CGRect(x: 20,y: 240,with: wid,height: hei))
25 //设置按钮在正常状态下的标题文字
26          submitButton.setTitle("Sumbit",for: .normal)
27 //给按钮对象绑定点击事件
28          submitButton.addTarget(self, 
29                               action: #selector(ViewController.submitForm(_:)),
30                                  for: .touchUpInside)
31 //设置按钮对象的背景颜色为灰色
32          submitButton.backgroundColor = .gray
33 //并设置按钮对象为不会响应交互事件的状态
34 //只有当文本框中的内容都被检验成功时,该按钮的状态才会恢复为正常。
35          submitButton.isEnabled = false
36 //将按钮对象添加到当前视图控制器的根视图
37          slef.view.addSubview(submitButton)    
38 
39 //获得通知中心的单例对象,并通过addObserver,对指定名称的通知进行监听,
40 //当收到指定名称的通知时,调用选择器中的checkForm方法。
41           NotificationCenter.default.addObserver(self, 
42                  action: #selector(ViewController.checkForm(_:)),
43                    name: NSNotification.Name(rawValue:"ceckFormNotification"),
44                  object: nil)    
45      }
46    
47 //当点击按钮时在控制台输出一条日志语句,模拟表单的动作
48      @objc func submitForm(_ sender: UIButton)
49      {
50           print("summitForm...")
51       }
52 
53 //接着添加一个方法,用来响应自定义视图中的文本框的回车键被按下的事件
54      func checkForm(_ notification: Notification?)
55      {
56 //当键盘中的回车键被按下时,对两个自定义视图中的文本框进行检验
57           if self.nameField.textField.text != "" && self.passwordField.textField.text != ""
58           {
59 //当两个文本框中的内容都不为空时,恢复提交按钮的可交互性,
60 //并调整按钮的背景颜色为橙色
61                self.submitButton.isEnabled = true
62                submitButton.backgroundColor = .orange      
63            } 
64            else
65           {
66 //当两个文本框中的内容有一个不为空,或者全部为空时,设置按钮不可进行点击
67 //背景颜色改为灰色。
68                self.submitButton.isEnabled = false
69                self.submitButton.backgroundColor = .gray 
70             }     
71       }  
72 
73 //在该类文件中,添加一个析构方法,当该类的实例对象被销毁时,
74 //及时移除通知中心,以免造成资源的浪费
75      deinit
76      {
77          NotificationCenter.default.removeObserver(self)
78       } 
79  
80      override func didReciveMemoryWarning(){
81           super.didReceiveMemoryWarning()
82 
83      }
84 }

此时自定义视图广播了一条指定名称的通知,并由控制器捕捉到了同名的通知。
由于两个文本框中的内容不为空,所以按钮对象的背景颜色变成了橙色。

转载于:https://www.cnblogs.com/strengthen/p/9834598.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java怎么调kettle_通过Java调取Kettle的结果集

Kettle端:Data Grid只是测试数据,目的是把数据传递到记录结果。Java端:package com.womai.util;import org.pentaho.di.core.KettleEnvironment;import org.pentaho.di.core.RowMetaAndData;import org.pentaho.di.trans.Trans;import org.pe…

Tomcat4/5连接池的设置及简单应用示例

标题:Tomcat4/5连接池的设置及简单应用示例关键字:Tomcat 连接池 JDBC驱动 Context 作者:jrq内容:一、Win2k下Tomcat4的连接池的配置1.安装JDK1.4和jakarta-tomcat-4.1.27.exe。 路径分别为 D:/jdk1.4 和 D:/Tomcat 4.1。 安装…

java并发编程实战阅读总结(a)

1、锁(lock)与volatile(1)、隐式锁,java提供了强制原子性的内置锁机制:synchronized块或synchronized方法。操作共享状态的复合操作必须是原子的,以避免竞态条件,比如读-改-写操作和检查再运行操作。复合操作会在完整的运行期占有…

我也确实很向往深圳这种拼搏的精神

今天跟个同学聊天,是关于他的offer选择,他拿了一个不错的外企岗位offer,这个offer的薪资是他现在薪资两倍还多一些,他现在人在外地,年后准备来深圳工作,他在微信说让我给些建议。首先我肯定的是&#xff0c…

VBA语法基础

数据类型 “数据类型”是指如何将数据存储在内存中。 (1)Boolean 表示逻辑数据,可以是True或False中的任一个值。占用2字节的存储空间,取值范围为True或False,缺省值为False。 (2)Byte 只能表示正数。占用1字节的存储空间,取值范围…

clamav Java_ClamAV安装使用及API例子

ClamAV是一款由Sourcefire组织开发的开源杀毒引擎,Sourcefire同时也是Snort入侵检测引擎的所有者。ClamAV提供了一种更为快速灵活的框架用以检测恶意代码和软件产品。可以作为现有的台式机、文件服务器、邮件服务器以及其他需要杀毒扫描软件场景中杀毒扫描软件的补充…

PHP json_encode后的数据有的大括号于中括号

当array是一个从0开始的连续数组时,json_encode出来的结果是一个由[]括起来的字符串。 而当array是不从0开始或者不连续的数组时,json_encode出来的结果是一个由{}括起来的key-value模式的字符串。转载于:https://www.cnblogs.com/xxllzizi/p/9836469.ht…

第一次使用 Blog

不喜欢BBS上不负责任的灌水,希望有一个记载自己日常心态和工作中所用到的有用技术的平台,作为自己以后的一个回顾,也与大家一同分享。很久就想拥有自己的Blog了,但这第一次使用 Blog ,还是有点兴奋,Blog这个…

中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux

去年 6 月份,中科院大学教授、中科院计算所研究员包云岗,发布了开源高性能 RISC-V 处理器核心 —— 香山。近日,包云岗在社交平台晒出图片,香山芯片已流片,回片后进行了串口调通,1 月 24 日成功运行了 Linu…

java并发编程实战阅读总结(b)

5、Executor框架 Executor框架是并发集合java.util.concurrent中的一个成员。 Executor为灵活且强大的异步任务执行框架提供了基础,还提供了对生命周期的支持,以及统计信息、应用管理机制和性能监视等机制。Executor 最早是为了解决生产者-消费者模式而…

公司那些事-关于领导

首先,请允许我将范围限定一下,本文中的领导,并不是指那些了不起的大人物,而是说IT企业中的,我们身边的组长,经理,部长等等,之所以这么限定,原因非常简单,本人只接触过这个层面的领导. 领导也是普通人在我们中间,经常有意无意的对领导提出一些比较高的要求,比如领导应该是技术专…

java io流操作_十个Demo进行讲解Java中IO流的常用操作~

好久不见的IO流对IO流的学习,我记得还是初学Java基础的时候,后来找工作过程中经常看到有些招聘信息中写到熟悉IO流,现在想想IO流,真的是一脸懵逼,不说这么多废话了,IO流这次好好整理一下。说说IO流的类别在…

这些应用仍未兼容安卓新版本,系统升级后将无法使用

8月7日,谷歌正式发布Android 9 Pie,至今已两月有余。近日,华为终端开放实验室对国内主流应用在Android 9 Pie的兼容性进行测试,结果显示:目前TOP3000应用兼容率已经超过95%,但仍有少量应用存在启动失败、闪…

非常郁闷,WinForm中正常显示的自定义控件无法在WebForm中正常显示!

我写了一个自定义控件(Win Control),此控件在WinForm中运行正常,但在WebForm中无法显示(在WebForm中此控件并不显示为红叉,但是一个对象图标)。由于没有出现权限或安全方面的提示,因此我从头开始一行一行进行比对,最终…

在家过年这两天|多图

这两天收到了很多朋友的新年祝福,在这里回应下,希望看到这篇文章的朋友们新的一年快乐开心,在求学的人学有所成,在工作的朋友们功成名就,家人健康,吃喝不愁……祝你们㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱…

两路归并排序

两路归并排序(升序排列) (平均/最差)时间复杂度O(NlogN) 将两个有序的单链表合并为一个有序的单链表,默认是按升序排列的。 合并操作是非常适合用递归来完成的一类操作,递归实现将会比迭代实现更加清晰且易于理解。 尽管如此&…

Eclipse下的项目管理插件介绍

前言 最近,一直学习开源项目的代码,难免会碰到各种版本管理器,作为一名在校大学生,学校的课程完全没提及到,靠着自己的摸索,走了不少弯路,写个列表,望对大家有所帮助.顺便提一下,这里只说客户端,至于服务端,自行根据提供的资料学习 CVS 这里eclipse自带就有,也有一段历史,现在的…

算命

今天大年初三,出了太阳变暖很多,我们带着家里的小朋友一起上街吃早餐。因为明天要去阳西,决定去外婆家看看,在超时买了点东西,走回车上刚好看到路边有算命先生,我就想着来计算一下。我先是问了记算一次多少…

back log

1*你应该备份日志 BACKUP LOG 数据库名 TO DISKc:\aalogbak WITH INIT,NO_TRUNCATE 这样你的日志清空也备份了,日志也清空了,你可以压缩了 在维护日志备份序列时,调度 BACKUP LOG 语句按间隔发生,以使事务日志不致增长到超过预期的…

java loadlibrary_java – System.loadLibrary不起作用.链中的第二个lib的UnsatisfiedLinkError...

我有通过JNI使用cpp共享库libclient.so的java程序Client.class.libclient.so构建为共享并使用cpp共享库libhttp.so.libclient.so和libhttp.so放在文件夹/ home / client / lib64中Client.class放在/ home / client / bin中客户端可以加载库> System.load和环境变量LD_LIBRAR…