swift项目第六天:中间发布按钮的封装以及监听点击事件
import UIKit
/*
总结:1:给UIButton写分类,新建文件swiftFile,一般为了区分起名字都是名字-Extension,要想调用UI控件需要导入 import UIKit框架,然后给系统的类写分类:extension UIButton {},提供类方法或是构造函数的方法,把与该控件有关的业务逻辑全封装在分类的内部。2:封装方法:类方法:都是以class开头,class func 函数名(参数)->返回值类型{业务逻辑代码,return 返回值}:例子: class func createButton(imageName:String,backgroundImageName:String) -> UIButton {},其中声明函数的时候,没有参数也加(),返回值只写类型。分类不用private和fileprivate修饰 3:构造函数方法:利用便利构造函数:
convenience init(_ imageName:String,bgImageName:String)
convenience为便利构造函数,便利构造函数通常用在对系统的类进行构造函数的扩充时使用
遍历构造函数的特点
1.遍历构造函数通常都是写在extension里面
2.遍历构造函数init前面需要加载convenience
3.在遍历构造函数中需要明确的调用self.init() convenience init(_ imageName:String,bgImageName:String) { //1:必须首先调用self.init()
self.init() //2:设置按钮
let higlingStr = "_highlighted" //2:设置按钮的bg图片与普通图片
setImage(UIImage(named:imageName), for: .normal)
setImage(UIImage(named:imageName + higlingStr), for: .highlighted)
setBackgroundImage(UIImage(named:bgImageName), for: .normal)
setBackgroundImage(UIImage(named:bgImageName+higlingStr), for: .highlighted) //3:设置按钮的尺寸
sizeToFit() }
注意:1:在构造函数中不用写返回值,因为系统默认会返回 2:在类中调用该类的方法可以省去self去调用 3:系统的第一个参数默认为内部参数,从第二个参数开始即为内部参数又为外部参数,要想让参数都变为内部参数,则在参数的前面加_+空格,仿照苹果系统的写法 2:懒加载:1:懒加载时用关键字lazy,用private或是fileprivate来修饰 2:懒加载有两种写法:1:直接初始化 如方法1 2:利用闭包懒加载: fileprivate lazy var composeBtn = {return 业务逻辑+返回值}(); ,苹果建议一般定义变量都使用懒加载 3:在定义变量或是属性的时候,必须给定明确的初始化值或是可选类型,后面去赋值,否则会报错
1:懒加载发布按钮,提供两种创建对象的方法:1:类方法,用类点语法调用
fileprivate lazy var composeBtn : UIButton = UIButton.createButton(imageName: "tabbar_compose_icon_add", backgroundImageName: "tabbar_compose_button")
2:对象方法获得button的实例:
fileprivate lazy var composeBtn = UIButton("tabbar_compose_icon_add", bgImageName: "tabbar_compose_button") 3:代码的书写:1:在定义的类中定义属性时,可以懒加载属性,也可以定义成可选类型或是直接给属性赋值,但是定义属性的时候需要考虑用不用private或是fileprivate修饰 2:在viewDidLoad中抽方法封装调用,封装的方法写在该类的extension扩展中 3:若是extension扩展中涉及某些业务逻辑的处理则写成系统类的分类(类方法或是构造函数方法),工具类,继承
2:在分类或是类中定义方法的时候,也要考虑用private或是fileprivate修饰,对按钮事件的监听:composeBtn.addTarget(self, action: #selector(MainViewController.composeBtnClic), for: .touchUpInside)
selector用#selector来包装,按钮点击事件的方法用类去调用该方法,枚举用.+枚举值,其中按钮的点击方法也写在extension的扩展中
3:封装按钮的点击事件:
extension MainViewController { @objc fileprivate func composeBtnClic() { DLog(message: "hello--word") } 事件监听本质发送消息.但是发送消息是OC的特性
将方法包装成@SEL --> 类中查找方法列表 --> 根据@SEL找到imp指针(函数指针) --> 执行函数
如果swift中将一个函数声明称private,fileprivate那么该函数不会被添加到方法列表中
如果在private前面加上@objc,那么该方法依然会被添加到方法列表中 */
class MainViewController: UITabBarController { // MARK:- 懒加载属性
fileprivate lazy var composeBtn = UIButton("tabbar_compose_icon_add", bgImageName: "tabbar_compose_button") // MARK:- 系统回调函数
override func viewDidLoad() {
super.viewDidLoad() //1:创建中间发布按钮
setupComposeBtn() }
} // MARK:- 设置UI界面
extension MainViewController { /// 设置发布按钮
fileprivate func setupComposeBtn() { // 1.将composeBtn添加到tabbar中
tabBar.addSubview(composeBtn) // 2.设置位置
composeBtn.center = CGPoint(x: tabBar.center.x, y: tabBar.bounds.size.height * 0.5) //3:设置监听
composeBtn.addTarget(self, action: #selector(MainViewController.composeBtnClic), for: .touchUpInside)
} } //MARK:-发布按钮的监听点击
extension MainViewController { @objc fileprivate func composeBtnClic() { DLog(message: "hello--word") } }
发布按钮的扩展:
import UIKit
extension UIButton {
//MARK:-1:提供类方法
class func createButton(imageName:String,backgroundImageName:String) -> UIButton {
//1:创建button
let button = UIButton()
let higlingStr = "_highlighted"
//2:设置按钮的bg图片与普通图片
button.setImage(UIImage(named:imageName), for: .normal)
button.setImage(UIImage(named:imageName + higlingStr), for: .highlighted)
button.setBackgroundImage(UIImage(named:backgroundImageName), for: .normal)
button.setBackgroundImage(UIImage(named:backgroundImageName+higlingStr), for: .highlighted)
//3:设置按钮的尺寸
button.sizeToFit()
//4:返回按钮
return button
}
//MARK:-2:提供对象方法:在构造函数的对象方法中,self就是当前调用方法的对象,所以不用再去创建对象
convenience init(_ imageName:String, bgImageName:String) {
//1:必须首先调用self.init()
self.init()
//2:设置按钮
let higlingStr = "_highlighted"
//2:设置按钮的bg图片与普通图片
setImage(UIImage(named:imageName), for: .normal)
setImage(UIImage(named:imageName + higlingStr), for: .highlighted)
setBackgroundImage(UIImage(named:bgImageName), for: .normal)
setBackgroundImage(UIImage(named:bgImageName+higlingStr), for: .highlighted)
//3:设置按钮的尺寸
sizeToFit()
}
}
swift项目第六天:中间发布按钮的封装以及监听点击事件的更多相关文章
- IOS之UI--自定义按钮实现代理监听点击事件
前言: Objective-C提供的按钮监听事件的方法是 不含参数的监听方法 [button实例对象 addTarget:self action:@selector(func) forControlE ...
- ASP.NET Core 发布之后通过命令控制监听地址和环境变量
添加Command支持 新建一个ASP.NET Core 项目,打开Program.cs 添加下面的代码: public class Program { public static void Main ...
- [Swift通天遁地]三、手势与图表-(1)监听屏幕上触摸事件的各种状态
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [Swift通天遁地]三、手势与图表-(2)监听手势事件自由拖动图像视图
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [转]android:动态创建多个按钮 及 批量设置监听
之前投机取巧,先创建好多个按钮,再根据需要的数量进行部分隐藏,不过还是逃不过呀. 这样根本无法批量地 findId,批量地 设置监听. 所以今天还是认认真真地研究回“动态创建按钮”,终于,通过不断尝试 ...
- 项目遇到的小问题(关于vue-cli中js点击事件不起作用和iconfont图片下载页面css样式乱的解答)
第一个:关于vue-cli中js点击事件不起作用 在vue的methods方法queryBtnFun()中拼接html和click操作事件的时候,发现点击事件一起未起作用: 后来发现是DOM执行顺序 ...
- spring-boot rabbitMq 完整项目搭建,包括创建、发送、监听
写在开始 rabbitMq 代码按照三部分介绍 第一部分 交换机和队列的创建 第二部分 消息发送 第三部分 消息监听 第一部分 1 建立queue 2 建立exchange 3 exchange绑定q ...
- Swift - 推送之本地推送(UILocalNotification)添加Button的点击事件
上一篇讲到的本地推送是普通的消息推送,本篇要讲一下带按钮动作的推送消息 import UIKit @UIApplicationMain class AppDelegate: UIResponder, ...
- AJ学IOS 之微博项目实战(12)发送微博自定义工具条代理实现点击事件
AJ分享,必须精品 一:效果 二:封装好的工具条 NYComposeToolbar.h 带代理方法 #import <UIKit/UIKit.h> typedef enum { NYCom ...
随机推荐
- Linux / Windows应用方案不完全对照表
Linux/Windows应用方案不完全对照表 650) this.width=650;" border="0" src="http://img1.51cto. ...
- 微信小程序从零开始开发步骤(五)轮播图
上一章完成页面自定义分享,这一章来说说轮播图,最常见的一个轮播图,中间带小圆点,自动轮播. Swiper是滑动特效插件,面向手机.平板电脑等移动终端.能实现触屏焦点图.触屏Tab切换.触屏多图切换等常 ...
- C++遍历目录+_finddata_t结构体用法
Struct _finddata_t是用来存储文件各种信息的结构体,使用这个结构体要引用的头文件为“ #include <io.h>”它的结构体定义如下: struct _finddata ...
- 【hihocoder 1378】网络流二·最大流最小割定理
[Link]:http://hihocoder.com/problemset/problem/1378 [Description] [Solution] 在求完最小割(最大流)之后; 可以在剩余网络中 ...
- NSCharacterSet 最经常使用的使用方法
NSString *str = @"<p>讨厌的</p>节点<br/></pN>"; //除去字符串中的不想要的 ...
- iOS动画之模拟音量振动条
音量振动条 效果图: 假设实现? 创建3个layer.按顺序播放y轴缩放动画 利用CAReplicatorLayer实现 1.什么是CAReplicatorLayer? 一种能够复制自己子层的laye ...
- 14.NPM 常用命令
转自:http://www.runoob.com/nodejs/nodejs-npm.html PM提供了很多命令,例如install和publish,使用npm help可查看所有命令. NPM提供 ...
- webservie授权调用
Dim usercode As String = System.Configuration.ConfigurationSettings.AppSettings("SAPWebServiceU ...
- VNC Server模拟攻击实战
VNC目前已被广泛应用的一个远程控制程序,很多攻击者对VNC的攻击技术研究热情是高涨的,丝毫不亚于对Windows的远程桌面(3389).PcAnywhere的攻击研究.从最开始爆发出来的VNC的低版 ...
- 关于Promise详解
异步回调 回调地狱 在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,就是常说的回调地狱 并行结果 如果几个异步操作之间并没有前后顺序之分,但需要等多个异步操作都完成后才能执行后续的任务 ...