• [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 }
  • 相关阅读:
    虚函数
    class与struct的区别
    HTTP是什么连接
    长连接与短连接
    多线程的主要优点
    overload、override、overwrite的介绍
    常用的Linux命令
    IO模型——IO多路复用机制
    栈区与堆区的区别
    软链接和硬链接到底有啥区别
  • 原文地址:https://www.cnblogs.com/strengthen/p/9815983.html
Copyright © 2020-2023  润新知