swift项目实战--微博的未登录界面的实现,和监听未登录界面两个按钮的两种实现方法

时间:2021-01-07 01:53:41

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的时候,默认就是按照主页的图片来布局的,通过图片参数是否有值来判断是不是为主页

swift项目实战--微博的未登录界面的实现,和监听未登录界面两个按钮的两种实现方法

    // 设置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;
}