在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本文将演示如何借助协议,实现视图控制器对象和其内部的自定义视图对象之间的数据传递。 首先创建一个自定义视图对象。在项目名称文件夹点击鼠标右键 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 width: 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(width: 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 }
|
请发表评论