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;
    }
原文地址:https://www.cnblogs.com/gchlcc/p/5625469.html