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 ...
随机推荐
- js -- fileData 实现文件断点续传
前端实现文件的断点续传 一.一些知识准备 断点续传,既然有断,那就应该有文件分割的过程,一段一段的传. 以前文件无法分割,但随着HTML5新特性的引入,类似普通字符串.数组的分割,我们可以可以使用sl ...
- Zabbix + Grafana
Grafana 简介 Grafana自身并不存储数据,数据从其它地方获取.需要配置数据源 Grafana支持从Zabbix中获取数据 Grafana优化了图形的展现,可以用来做监控大屏 Grafana ...
- LA 2531 The K-league 最大流
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> ...
- 分享一下事件监听addEventListener----attachEvent的用法
来自:http://www.cnblogs.com/wkylin/archive/2011/10/09/2203161.html 事件监听addEventListener----attachEvent ...
- at&&atq&&atrm---定时任务
at放在 ls /var/spool/at/ 目录下 At的配置文件/etc/at.deny和/etc/at.allow 如果deny单独存在,则是deny以为的所有用户都可以使用at命令 如果all ...
- 【2017 Multi-University Training Contest - Team 2】Maximum Sequence
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6047 [Description] 给你一个数列a和一个数列b; 只告诉你a的前n项各是什么; 然后 ...
- BZOJ 1507 NOI2003 Editor Splay
题目大意: 1.将光标移动到某一位置 2.在光标后插入一段字符串 3.删除光标后的一段字符 4.输出光标后的一段字符 5.光标-- 6.光标++ 和1269非常像的一道题,只是弱多了 几个问题须要注意 ...
- ZOJ Problem Set - 3819Average Score
ZOJ Problem Set - 3819Average Score 题目链接 题目大意:给你两个班的的学生的分数(A,B班).A班有一个学生的分数没有给出. 如今要求你给出这个学生分数的上下限.使 ...
- VPS搭建与IPv6使用教程
VPS搭建与IPv6使用教程 SoftEther命令: yum -y install gcc zlib-devel openssl-devel readline-devel ncurses-devel ...
- centos6.*yum源更新
[1] 首先备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak [2]编辑vi /etc/yu ...