zoukankan      html  css  js  c++  java
  • swift项目实战--微博的未登录界面的实现,和监听未登录界面两个按钮的两种实现方法

    1.未登录界面的实现

    • 微博项目中,用户不登录的话,显示的是未登录的界面.项目中TabBarVC的子控制器都是tableViewVC,所以抽取了父类,让父类判断用户是否登录,决定显示什么样的界面.loadView方法决定了控制器上view的样式,所以父类通过重写这个方法来实现
        let isLogin = false
        // 未登录显示的view
        var visitorView : VisitorView?
    
        override func loadView() {
    
            // 判断用户是否登录决定显示的view
            isLogin ? super.loadView() : setupVisitorView()
        }
    
        func setupVisitorView () {
    
            visitorView = VisitorView.visitorView()
    
            view = visitorView;
        }
    
    • 未登录界面通过xib来描述,xib对外提供一个快速创建的方法,与OC相比较 func == - (对象方法) class func == +(类方法)
        class func visitorView() -> VisitorView {
            let view = NSBundle.mainBundle().loadNibNamed("VisitorView", owner: nil, options: nil).last
            return view as! VisitorView
        }
    
    • xib还要对外界提供一个修改界面图片和文字的方法.图片的参数为可选类型,因为布局xib的时候,默认就是按照主页的图片来布局的,通过图片参数是否有值来判断是不是为主页

        // 设置visitorView显示的样式
        func setupVisitorInfo(imageName : String?,title : String) {
            // 设置显示文本
            titleLabel.text = title
            guard let imgName = imageName else {
                // imageName没有值的话,是主页 -- 因为默认显示的就是主页图片,不用设置
                // 做动画旋转
                rotationImageView.hidden = false
                startAnimation()
                return
            }
    
            // 其他页
            iconImageView.image = UIImage(named: imgName)
            // 转盘图片不可见
            rotationImageView.hidden = true
        }
    
            // 转盘动画
            private func startAnimation() {
            // 创建基本动画
            let anim = CABasicAnimation(keyPath: "transform.rotation")
            // 设置动画的属性
            anim.toValue = 2 * M_PI
            anim.duration = 5.0
            anim.repeatCount = MAXFLOAT
            // 添加了动画的view消失的时候,系统默认会将动画移除.
            // 只要设置removedOnCompletion = false 系统就不会移除动画
            anim.removedOnCompletion = false
    
            rotationImageView.layer.addAnimation(anim, forKey: nil)
        }
    

    2.监听未登录界面中注册和登录按钮的点击

    <1>第一种实现方法,通过代理监听.swift中代理的实现

    • 定义swift中代理的协议
    // swift 中的代理必须继承自NSObjectProtocol
    protocol VisitorViewDelegate : NSObjectProtocol
    {
        // 代理中的方法默认必须实现,有可以不实现的情况,以后整理
        func visitorViewDidClickRegisterBtn(visitorView : VisitorView)
        func visitorViewDidClickLoginBtn(visitorView : VisitorView)
    }
    
    • 在按钮点击的事件中执行代理方法
        // 注册按钮的点击
        @IBAction func registerBtnClick(sender: UIButton) {
            // 监听到点击,通知代理做事情
            // 代理中的方法默认是必须实现的(也有可选的,后面再说),所以这里没有判断代理有没有实现相应的方法
            delegate?.visitorViewDidClickRegisterBtn(self)
        }
    
        // 登录按钮的点击
        @IBAction func loginBtnClick(sender: UIButton) {
            // 监听到点击,通知代理做事情
            delegate?.visitorViewDidClickLoginBtn(self)
        }
    
    • swift中为了让方法分类更清晰,实现代理或者数据源的方法单独写到分类中
    // MARK: - VisitorViewDelegate代理方法
    // swift 中为了区分不同类型的代理方法或者数据源方法,通过extension实现了更好的区分
    extension BaseTableViewController: VisitorViewDelegate
    {
    
        func visitorViewDidClickRegisterBtn(visitorView : VisitorView) {
    
            ChaosLog("")
        }
    
        func visitorViewDidClickLoginBtn(visitorView : VisitorView) {
    
            ChaosLog("")
        }
    }
    

    <2>第二种实现方法

    • 因为抽取的父类(BaseVC)中用到了未登录界面的这个类(以下统称visitorView),所以BaseVC中定义了visitorView属性,在BaseVC初始化visitorView的时候,直接通过visitorView拿到visitorView中的两个按钮来监听事件
        func setupVisitorView () {
    
            visitorView = VisitorView.visitorView()
    
    //        visitorView?.delegate = self
    
            // 监听visitorView中按钮的点击
            visitorView?.registerButton.addTarget(self, action: Selector("registerBtnClick:"), forControlEvents: UIControlEvents.TouchUpInside)
    
            visitorView?.loginButton.addTarget(self, action: Selector("loginBtnClick:"), forControlEvents: UIControlEvents.TouchUpInside)
    
            // 用户未登录的情况,导航栏左右按钮分别为注册和登录
            navigationItem.leftBarButtonItem = UIBarButtonItem(title: "注册", style: UIBarButtonItemStyle.Done, target: self, action: Selector("registerBtnClick:"))
            navigationItem.rightBarButtonItem = UIBarButtonItem(title: "登录", style: UIBarButtonItemStyle.Done, target: self, action: Selector("loginBtnClick:"))
    
            view = visitorView;
        }
    
  • 相关阅读:
    如何在ProXmoX VE 下虚拟机安装 黑群晖 DSM 6.1.6
    MySQL数据库(六) —— SQL注入攻击、视图、事物、存储过程、流程控制
    MySQL数据库(五)—— 用户管理、pymysql模块
    MySQL数据库(四)—— 记录相关操作之插入、更新、删除、查询(单表、多表)
    MySQL数据库(三)—— 表相关操作(二)之约束条件、关联关系、复制表
    MySQL数据库(二)——库相关操作、表相关操作(一)、存储引擎、数据类型
    MySQL数据库(一)—— 数据库介绍、MySQL安装、基础SQL语句
    并发编程(六)——进程/线程池、协程、gevent第三方库
    并发编程(五)——GIL全局解释器锁、死锁现象与递归锁、信号量、Event事件、线程queue
    并发编程(四)——线程、开启线程、守护线程、线程互斥锁
  • 原文地址:https://www.cnblogs.com/gchlcc/p/5625469.html
Copyright © 2011-2022 走看看