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()

    }

}
时间: 2024-12-24 11:06:17

swift项目第六天:中间发布按钮的封装以及监听点击事件的相关文章

IOS之UI--自定义按钮实现代理监听点击事件

前言: Objective-C提供的按钮监听事件的方法是 不含参数的监听方法 [button实例对象 addTarget:self action:@selector(func) forControlEvents:UIControlEventTouchUpInside]; 含参数的监听方法 [button实例对象 addTarget:self action:@selector(func:) forControlEvents:UIControlEventTouchUpInside]; 下面通过代理的

封装一个UIImageView的点击事件

封装一个UIImageView的点击事件像UIButton那样的点击事件 首先 创建一个类 继承自UIImageView  在类里实现一个点击的方法 - (void)addTarget:(id)target action:(SEL)action 在这个方法里把userInteractionEnabled=YES ; - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 直接上代码  简单的封装 更易于原来加手势的那种点击

ASP.NET Core 发布之后通过命令控制监听地址和环境变量

添加Command支持 新建一个ASP.NET Core 项目,打开Program.cs 添加下面的代码: public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseConfigurati

android项目 之 来电管家(5) ----- 添加监听服务

上面四节,已经实现了界面设计,黑名单(白名单的添加与删除与黑名单同理,不再赘述),启用监听开关,定时拦截开关,及拦截模式选择等功能,下面就要实现来电管家最核心的功能,也就是拦截功能.   主要思路: 1.  制定拦截模式,这里主要有两个,一个是黑名单模式,也就是只拦截在黑名单中的号码:另一个就是白名单模式,拦截除了白名单以外的号码. 2.  根据用户自定义设置信息,制定正则表达式,判断拦截的标准. 3.  使用对应的类实现挂断电话的功能. 监听模块主要是利用service实现功能,为了实现电话挂

猫猫学iOS 之微博项目实战(12)发送微博自定义工具条代理实现点击事件

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果 二:封装好的工具条 NYComposeToolbar.h 带代理方法 #import <UIKit/UIKit.h> typedef enum { NYComposeToolbarButtonTypeCamera, // 拍照 NYComposeToolbarButtonTypePicture, // 相册 NYComposeToolbarButto

监听鼠标滚动事件,如滚动鼠标出现返回顶部按钮

JQuery方法: $(window).bind('scroll',function(){ // var len = $(this).scrollTop() if($('body').scrollTop() < 10){ $('#DiaLayer').hide(); } else { $('#DiaLayer').show(); }}) 原生代码: // scrollFlag = false时向下滚动出现导航条 var scrollFlag = false; window.onscroll =

Swift 项目 01

1.项目的搭建 1.1 创建文件 1.1.1 删除模板文件 --> viewController.Swift, main.storyBoard 1.1.2 创建项目结构, 主目录 Classess --> 二级目录Module(功能模块), Model(业务模型), Tools(工具)---> Module 的子目录Main,Home, Message,Discover,profile 1.1.3 创建项目文件,创建每个功能模块对应的storyBoard+控制器,(每个视图控制器都继承自

android 按钮点击事件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBo

监听按钮的点击事件的三种实现方式

1.匿名内部类监听按钮点击事件 Button buttonup=(Button)findViewById(R.id.btn_signup); //找到需要的Button按钮,转换成Button类型 buttonin.setOnClickListener(new View.OnClickListener() { //设置Button的监听器 @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"点击了登录