• 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;
        }
    
  • 相关阅读:
    AChartEngine方法的使用及事件汇总
    免费的Android UI库及组件推荐
    消灭Bug!十款免费移动应用测试框架推荐
    AChartEngine 安卓折线图 柱形图等利器
    添加几个有用的网址
    演示Android百度地图操作功能
    Android 如何在Eclipse中查看Android API源码 及 support包源码
    Android入门之GPS定位详解
    软考之数据库部分
    SSE && WebSockets
  • 原文地址:https://www.cnblogs.com/gchlcc/p/5625469.html
Copyright © 2020-2023  润新知