[Swift实际操作]八、实用进阶-(4)通过protocol在两个对象中进行消息传递

本文将演示如何借助协议,实现视图控制器对象和其内部的自定义视图对象之间的数据传递。

首先创建一个自定义视图对象。在项目名称文件夹点击鼠标右键
New File ->Cocoa Touch Class(默认选项) ->
Class(类名):CustomView
SubClass of(父类名称):UIView
Language(语言选项):Swift
->点击下一步按钮,选择文件存储位置,点击Create按钮,完成文件CustomView.swift的创建。
现在开始编码,实现自定义视图对象,它将拥有一个文本输入框。

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

然后打开左侧的项目导航区,打开视图控制器的代码文件(ViewController.swift)
你将在视图控制器之中,插入自定义视图对象。

 1 import UIKit
 2 //点击修复(Fix)图标,自动补充缺失的协议方法。
 3 class ViewController: UIViewController, DemoDelegate{
 4 //添加两个自定义视图类型的属性
 5      var nameField: CustomView! 
 6      var passwordField: CustomView! 
 7 //添加一个提交按钮,当点击该按钮时,提交整个表单。
 8      var submitButton: UIButton!    
 9 
10      override func viewDidLoad(){
11          super.viewDidLoad()
12 //初始化两个整形常量,作为自定义视图的宽度和高度
13          let wid = Int(self.view.frame.size.width) - 40
14          let hei = 40
15 
16 //然后对第一个自定义视图属性进行初始化,并设置它的显示区域和代理对象
17          nameField = CustomView(frame: CGRect(x: 20,y: 80,with: wid,height: hei))
18 //将自定义视图对象添加到当前视图控制器的根视图
19          self.veiw.addSubview(nameField)
20          
21 //对第二个自定义视图属性进行初始化,并设置它的显示区域
22          passwordField= CustomView(frame: CGRect(x: 20,y: 140,with: wid,height: hei))
23 //设置它的代理对象为当前的视图控制器,
24          passwordField.delegate = self
25 //并将自定义视图对象添加到当前视图控制器的根视图
26          self.view.addSubview(passwordField)
27 
28 //初始化提交按钮属性,并设置它的显示区域
29          submitButton = UIButton(frame: CGRect(x: 20,y: 240,with: wid,height: hei))
30 //设置按钮在正常状态下的标题文字
31          submitButton.setTitle("Sumbit",for: .normal)
32 //给按钮对象绑定点击事件
33          submitButton.addTarget(self, 
34                                 action: #selector(ViewController.submitForm(_:)),
35                                 for: .touchUpInside)
36 //设置按钮对象的背景颜色为灰色
37          submitButton.backgroundColor = .gray
38 //并设置按钮对象为不会响应交互事件的状态
39 //只有当文本框中的内容都被检验成功时,该按钮的状态才会恢复为正常。
40          submitButton.isEnabled = false
41 //将按钮对象添加到当前视图控制器的根视图
42          slef.view.addSubview(submitButton)     
43      }
44    
45 //当点击按钮时在控制台输出一条日志语句,模拟表单提交的动作
46      @objc func submitForm(_ sender: UIButton)
47      {
48           print("summitForm...")
49       }
50 
51 //自定义协议中的方法
52      func checkForm()
53      {
54 //当键盘中的回车键被按下时,对两个自定义视图中的文本框进行检验
55           if self.nameField.textField.text != "" && self.passwordField.textField.text != ""
56           {
57 //当两个文本框中的内容都不为空时,恢复提交按钮的可交互性,
58 //并调整按钮的背景颜色为橙色
59                self.submitButton.isEnabled = true
60                submitButton.backgroundColor = .orange      
61            } 
62            else
63           {
64 //当两个文本框中的内容有一个不为空,或者全部为空时,设置按钮不可进行点击
65 //背景颜色改为灰色。
66                self.submitButton.isEnabled = false
67                self.submitButton.backgroundColor = .gray 
68             }     
69       }   
70  
71      override func didReciveMemoryWarning(){
72           super.didReceiveMemoryWarning()
73 
74      }
75 }
原文地址:https://www.cnblogs.com/strengthen/p/9815983.html