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 ...
随机推荐
- VS中创建自定义一个VC工程为基础的开发向导的总结
作者:朱金灿 来源:http://blog.csdn.net/clever101 VS允许用户进行自定义开发向导.自定义开发向导的好处在于将常用的设置都通过向导生成,从而大大提供开发效率.特别是在开发 ...
- host---域名查询
host命令是常用的分析域名查询工具,可以用来测试域名系统工作是否正常. 选项 -a:显示详细的DNS信息: -c<类型>:指定查询类型,默认值为“IN“: -C:查询指定主机的完整的SO ...
- POJ——T 1961 Period
http://poj.org/problem?id=1961 Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 18542 ...
- jquary依据td中button的元素属性删除tr行(删选出想删除的行)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcnVveXVhbnlp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- 例说linux内核与应用数据通信(四):映射设备内核空间到用户态
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流,请勿用于商业用途] 一个进程的内存映象由以下几部分组成:代码段.数据段.BSS段和 ...
- fragment-实例创建跟使用
今天接触到了fragment,在网上看到了它的使用方法.现在把它的创建跟使用记录下,方便以后查询. 1.创建一个自己的fragment,继承自fragment package com.android. ...
- 最小生成树(MST,minimum spanning tree)
生成树:由图生成的树,由图转化为树,进一步可用对树的相关操作来对图进行操作.最小指的是权值最小: 生成树是边的集合,如下图所示的最小生成树:MST={{a,b},{a,f},{f,c}} 本文主要探讨 ...
- css 兼容性前缀
一.不同浏览器内核下的书写规则 二:transform 具体变性中心基点 transform-origin 默认情况下 rotate旋转.scale缩放.translate位移.矩阵matri ...
- 洛谷P2147 [SDOI2008]Cave 洞穴勘测
题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假 ...
- Android 调试出现 could not get wglGetExtensionsStringARB
解决 AVD Manager -> 选择模拟器 -> 点击 Edit看 Enabled 是不是被选中了.是的话取消选中,OK.希望对你实用.