[Swift4.2实际操作]九、完整实例-(5)创建BaseViewController作为控制器的基类

本文将给项目中的所有视图控制器,创建一份基类。该基类用来定义一些共用的属性和方法。

首先在用来放置视图控制器类的文件夹上点击鼠标右键,打开右键 菜单。

选择【New File】创建文件选项。

在弹出的文件模板选择窗口中,保持默认的选项,

然后点击【Next】下一步按钮,进入下一步设置页面。输入类名、父类、语言

【Class】:BaseViewController
【Subclass】:UIViewController
【Language】:Swift

然后点击【Next】下一步按钮,进入下一步设置页面。

选择文件存储位置,点击【Create】按钮,完成文件的创建。

  1 import UIKit
  2 //首先添加一个枚举类型,包含两个成员:解析和答案。
  3 enum TabType : Int {
  4     case Analysis = 1
  5     case Answer = 2
  6 }
  7
  8 //添加另一个枚举类型,该枚举包含两个成员:
  9 //美国大学入学考试和由美国大学委员会主办的学术能力评估测试
 10 enum PaperType : Int{
 11     case ACT = 1
 12     case SAT = 2
 13 }
 14
 15 class BaseViewController: UIViewController {
 16     //添加一个字符串常量,作为项目中所有服务器请求地址的开头部分。
 17     let baseUrl = "https://www.cnblogs.com/strengthen/"
 18     //添加按钮对象:作为页面左上角的后退按钮
 19     var backBt : UIButton!
 20     //添加按钮对象:作为页面左上角的关闭
 21     var dismissBt : UIButton!
 22     //添加颜色对象,作为所有页面中的文字的深灰色
 23     let fontColorDarkGray = UIColor(red: 74.0/255, green: 74.0/255, blue: 74.0/255, alpha: 1.0)
 24     //添加颜色对象,作为所有页面中的文字的浅灰色
 25     let fontColorLightGray = UIColor(red: 229.0/255, green: 229.0/255, blue: 229.0/255, alpha: 1.0)
 26     //添加颜色对象,作为文字的红色
 27     let fontColorRed = UIColor(red: 255.0/255, green: 89.0/255, blue: 95.0/255, alpha: 1.0)
 28      //添加颜色对象,作为文字的绿色
 29     let fontColorGreen = UIColor(red: 0.0/255, green: 126.0/255, blue: 125.0/255, alpha: 1.0)
 30      //添加颜色对象,作为文字的蓝色
 31     let fontColorBlue = UIColor(red: 74.0/255, green: 144.0/255, blue: 226.0/255, alpha: 1.0)
 32      //添加颜色对象,作为分割线的颜色
 33     let fontColorSplit = UIColor(red: 230.0/255, green: 230.0/255, blue: 230.0/255, alpha: 0.5)
 34     //添加四个字体对象,作为正文、标题等项目的文字大小
 35     let fontName : String = "PingFang SC"
 36     let font14 : UIFont = UIFont(name: "PingFang SC", size: 14)!
 37     let font17 : UIFont = UIFont(name: "PingFang SC", size: 17)!
 38     let font20 : UIFont = UIFont(name: "PingFang SC", size: 20)!
 39     let font24 : UIFont = UIFont(name: "PingFang SC", size: 24)!
 40     //添加四个变量
 41     //作为标签、文本框等组件的宽度、高度的基准数值
 42     var width40 : Int = 0
 43     var widthFull : Int = 0
 44     var heightFull : Int = 0
 45     var startPoint : CGPoint!
 46
 47     override func viewDidLoad() {
 48         super.viewDidLoad()
 49         //由于页面的底色比较深。所以设置状态栏的风格为亮色,
 50         //同时隐藏导航控制器的后退按钮。
 51         UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent
 52         //隐藏导航控制器的控制按钮
 53         self.navigationItem.hidesBackButton = true
 54
 55         // Do any additional setup after loading the view.
 56         //对组件常见的高度和宽度进行初始化
 57         self.width40 = Int(self.view.frame.size.width) - 40
 58         self.heightFull = Int(self.view.frame.size.height)
 59         self.widthFull = Int(self.view.frame.size.width)
 60         //应用程序的所有页面都使用相同渐变类型的背景颜色,在基类中创建背景颜色。
 61         //这样所有继承自该基类的视图控制器,也都自动具有相同的背景。
 62         let gradientLayer = CAGradientLayer()
 63
 64         gradientLayer.bounds = CGRect(x: 0, y: 0, width: self.widthFull+1, height: self.heightFull+1)
 65         //设置渐变层的位置和渐变的起始颜色、中间颜色和结束颜色
 66         gradientLayer.position = CGPoint(x: self.widthFull/2, y: self.heightFull/2)
 67         gradientLayer.colors = [UIColor(red: 48.0/255, green: 35.0/255, blue: 174.0/255, alpha: 1.0).cgColor, UIColor(red: 126.0/255, green: 67.0/255, blue: 170.0/255, alpha: 1.0).cgColor]
 68         //设置渐变层的起始点和结束点,从而创建一个45度方向的渐变背景层
 69         gradientLayer.startPoint = CGPoint(x: 1, y: 1)
 70         gradientLayer.endPoint = CGPoint(x: 0, y: 0)
 71         self.view.layer.insertSublayer(gradientLayer, at: 0)
 72         //对所有页面共有的后退按钮进行初始化,并设置它的图片样式。
 73         backBt = UIButton(frame: CGRect(x: 11, y: 26, width: 33, height: 33))
 74         backBt.setImage(UIImage(named:"LeftArrow"), for: .normal)
 75         //给按钮对象添加绑定事件
 76         backBt.addTarget(self, action: #selector(BaseViewController.backBtTapped(_:)), for: .touchUpInside)
 77         //并添加到根视图中。
 78         self.view.addSubview(backBt)
 79         //接着对关闭按钮进行初始化,并设置它的图片样式
 80         dismissBt = UIButton(frame: CGRect(x: 13, y: 20, width: 40, height: 40))
 81         dismissBt.setImage(UIImage(named:"iconCloseBlack"), for: .normal)
 82         //给按钮对象绑定点击事件
 83         dismissBt.addTarget(self, action: #selector(BaseViewController.dismissBtTapped(_:)), for: .touchUpInside)
 84         //默认状态处于隐藏状态
 85         dismissBt.isHidden = true
 86         //添加到根视图中
 87         self.view.addSubview(dismissBt)
 88     }
 89
 90     //添加一个方法,用来响应后退按钮的点击事件。当按钮被点击时,使导航控制器返回上一个页面。
 91     //MARK: -
 92     //MARK: back
 93
 94     @objc func backBtTapped(_ sender:UIButton)
 95     {
 96         self.navigationController?.popViewController(animated: true)
 97     }
 98
 99     //添加一个方法,用来响应关闭按钮的点击事件。当按钮被点击时,关闭弹出的窗口。
100     //MARK: cancel
101     @objc func dismissBtTapped(_ sender:UIButton)
102     {
103         self.dismiss(animated: true, completion: nil)
104     }
105
106     //添加一个方法,用来获得键盘的高度。
107     //MARK: KeyboardHeight
108     func getKeyboardHeight() -> Int
109     {
110         //首先获得键盘的输入模式
111         let lang = UITextInputMode.activeInputModes[0]
112         let primaryLanguage = lang.primaryLanguage
113         //判断当键盘的语言为英文时,返回指定的键盘高度。
114         if(primaryLanguage == "en-US")
115         {
116             return 253
117         }
118         //判断当键盘的语言是中国大陆简体中文时,根据屏幕是否为Plus屏幕,返回不同的键盘高度。
119         else if(primaryLanguage == "zh-CN")
120         {
121             if(self.view.frame.size.width == 414)
122             {
123                 return 256+40
124             }
125             else
126             {
127                 return 256
128             }
129         }
130          //判断当键盘的语言是通用简体中文时,根据屏幕是否为Plus屏幕,返回不同的键盘高度。
131         else if(primaryLanguage == "zh-Hans")
132         {
133             if(self.view.frame.size.width == 414)
134             {
135                 return 216+40
136             }
137             else
138             {
139                 return 216
140             }
141
142         }
143         //最后返回当键盘数据表情键盘或默认状态下的高度
144         else if(primaryLanguage == "emoji")
145         {
146             return 216
147         }
148
149         return 253
150     }
151
152     //接着实现手指在屏幕上由右向左滑动时,使导航控制器返回上一页的功能。
153     //首先重写视图控制器的手指按下的事件
154     //MARK: -
155     //MARK: touchesBegan
156     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
157     {
158         //获得触摸手势的第一个触摸点,在当前视图中的坐标
159         let touch = touches.first
160         startPoint = touch?.location(in: self.view)
161     }
162
163     //重写手指滑动时的事件
164     override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
165     {
166         ///获得触摸手势的第一个触摸点的坐标
167         let touch = touches.first
168         let touchPoint = touch?.location(in: self.view)
169         //获得当前点的坐标和刚开始手指按下时的坐标的水平距离和垂直距离。
170         let disX = (touchPoint?.x)! - (startPoint?.x)!
171         let disY = abs((touchPoint?.y)! - (startPoint?.y)!)
172         //处理当手指在水平方向上,从右向左滑动大于50点的情况
173         if(disY < 10 && disX > 50)
174         {
175             //假如当前的视图控制器处于导航控制器的内部,则使导航控制器返回上一个页面。
176             if(self.navigationController != nil)
177             {
178                 startPoint = CGPoint(x: 0, y: 0)
179                 self.navigationController?.popViewController(animated: true)
180             }
181         }
182     }
183
184     //重写手势的结束事件,恢复起点的坐标
185     override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
186     {
187         startPoint = CGPoint(x: 0, y: 0)
188     }
189
190     //最后重写手势的取消事件,同样恢复起点的坐标。
191     override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?)
192     {
193         startPoint = CGPoint(x: 0, y: 0)
194     }
195
196     //添加一个方法,用来隐藏标签控制器底部的标签
197     func hideTabBar()
198     {
199         self.tabBarController?.tabBar.isHidden = true
200     }
201
202     //添加一个方法,用来显示签控制器底部的标签
203     func showTabBar()
204     {
205         self.tabBarController?.tabBar.isHidden = false
206     }
207
208     //接着打开项目控制器的类文件ViewController.swift
209     override func didReceiveMemoryWarning() {
210         super.didReceiveMemoryWarning()
211         // Dispose of any resources that can be recreated.
212     }
213 }

将视图控制器的父类UIViewController,修改为创建的基类BaseViewController

 1 import UIKit
 2 //记得将父类的名称UIViewController修改为BaseViewController
 3 class ViewController: BaseViewController {
 4
 5     override func viewDidLoad() {
 6         super.viewDidLoad()
 7
 8     }
 9
10     override func didReceiveMemoryWarning() {
11         super.didReceiveMemoryWarning()
12         // Dispose of any resources that can be recreated.
13     }
14 }

原文地址:https://www.cnblogs.com/strengthen/p/9888542.html

时间: 2024-11-09 01:02:41

[Swift4.2实际操作]九、完整实例-(5)创建BaseViewController作为控制器的基类的相关文章

[Swift4.2实际操作]九、完整实例-(6)创建App欢迎界面

1 import UIKit 2 3 class WelcomeViewController: BaseViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 // Do any additional setup after loading the view. 9 //隐藏导航控制器的导航条 10 self.navigationController?.setNavigationBarHidden(t

基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作

在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思路和特点,对Controller进行了封装.使得控制器能够获得很好的继承关系,并能以更少的代码,更高效的开发效率,实现Web项目的开发工作,整个控制器的设计思路如下所示. 从上图的设计里面可以看到,我把主要能通过抽象封装的CRUD方法都放到了BusinessController<B, T>类里面,

基于MVC4+EasyUI的Web开发框架形成之旅(6)--基类控制器CRUD的操作

在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思路和特点,对Controller进行了封装.使得控制器能够获得很好的继承关系,并能以更少的代码,更高效的开发效率,实现Web项目的开发工作,整个控制器的设计思路如下所示. 从上图的设计里面可以看到,我把主要能通过抽象封装的CRUD方法都放到了BusinessController<B, T>类里面,

超详细的php用户注册页面填写信息完整实例(附源码)

这篇文章主要介绍了一个超详细的php用户注册页面填写信息完整实例,内容包括邮箱自动匹配.密码强度验证以及防止表单重复等,小编特别喜欢这篇文章,推荐给大家. 注册页面是大多数网站必备的页面,所以很有必要对自己的注册页面做些精心的设计.下面三张图,第一张是注册的展示页面,第二张思维导图就一个简单的逻辑,第三张是通过firebug查看调用的JS文件. 一.给每个输入框写下说明 在用户看到这个输入框的时候,就能非常清晰的明白这个输入框是做啥用的,最大限度的降低他们产生疑惑的可能性.我们需要假设用户毫不了

python测试mysql写入性能完整实例

这篇文章主要介绍了python测试mysql写入性能完整实例,具有一定借鉴价值,需要的朋友可以参考下 本文主要研究的是python测试mysql写入性能,分享了一则完整代码,具体介绍如下. 测试环境: (1) 阿里云服务器centos 6.5 (2) 2G内存 (3) 普通硬盘 (4) mysql 5.1.73 数据库存储引擎为 InnoDB (5) python 2.7 (6) 客户端模块 mysql.connector 测试方法: (1) 普通写入 (2) 批量写入 (3) 事务加批量写入

AES与RSA混合加密完整实例

前言 前段时间看到一篇文章讲如何保证API调用时数据的安全性(传送门:https://blog.csdn.net/ityouknow/article/details/80603617),文中讲到利用RSA来加密传输AES的秘钥,用AES来加密数据,并提供如下思路: 说人话就是前.后端各自生成自己的RSA秘钥对(公钥.私钥),然后交换公钥(后端给前端的是正常的明文公钥,前端给后端的是用后端公钥加密后的密文公钥:PS:其实我觉得直接交换两个明文公钥就行了),后端生成AES的明文key,用明文key进

HTML5 本地文件操作之FileSystemAPI实例(二)

文件操作实例整理二 1.删除文件.复制文件.移动文件 //获取请求权限 window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; window.requestFileSystem(window.TEMPORARY, 5 * 1024, initFs, errorHandler); function initFs(fs) { //删除文件 fileEntry.remove() fs.

[转]C语言构建动态数组完整实例

原文地址:http://www.jb51.net/article/52153.htm 本文以一个完整的实例代码简述了C语言构建动态数组的方法,供大家参考,完整实例如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <stdio.h> #include <malloc.h> int main(void) {     int len;     int * arr;     printf("请输入数组长度:&q

struts1.x完整实例

struts1.x完整实例 1.简介 struts是WEB程序MVC分层架构中的C,属于控制层,主要进行处理用户的请求,基于请求驱动.获取用户的请求地址并将表单中的数据封装到Form对象后交给Action进行处理.在Action中进行条用业务层处理具体的请求后将结果通过ActionMapping封装跳转地址返回给用户.struts是对servlet的再次封装,使得更加灵活高效.下面以一个登录的实例讲解struts的开发过程. 2.在新建的web工程中添加以下struts1.x  jar包 ant