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;
}
swift项目实战--微博的未登录界面的实现,和监听未登录界面两个按钮的两种实现方法的更多相关文章
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-13基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...
- Canal 实战 | 第一篇:SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存
一. Canal 简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同 ...
- oracle 远程登录sqlplus TNS:无监听
1.将localhost 改成 计算机名 best-PC,或者ip地址 . 我修改成计算机名,因为经常在无线网络和有限网络之间切换 SID_LIST_LISTENER = (SID_LIST = ...
- swift项目实战FoodPin目录
好吧,据说写博客能够找到好工作,那我也来分享一个项目吧! 自己自学iOS开发也有半年多了,现在就来分享一个swift的小项目吧!这个项目的来源是<Beginning iOS8 programmi ...
- vue路由守卫应用,监听是否登录
路由跳转前做一些验证,比如登录验证,是网站中的普遍需求. 对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards). 导航守卫 ...
- mac本 maven项目还没发布成功,tomcat就报没有监听ContextLoaderListener 的解决方法
Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL 严重: Error config ...
- swift项目第七天:构建访客界面以及监听按钮点击
一:访客界面效果如图 二:xib封装访客视图的view 1:业务逻辑分析:1:由于用户未登录时要显示访客视图,要先进行判断用户是否登录,未登录则显示访客视图,登录则显示正常的登陆界面,由于要在四个子控 ...
- Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课
Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课 本课程采用Q Q群直播方式进行直播,价值99元视频课程免费直播.完整的基于Swift项目实战,手把手教你做一个Swift版i ...
- (转载)Android项目实战(二十七):数据交互(信息编辑)填写总结
Android项目实战(二十七):数据交互(信息编辑)填写总结 前言: 项目中必定用到的数据填写需求.比如修改用户名的文字编辑对话框,修改生日的日期选择对话框等等.现总结一下,方便以后使用. 注: ...
随机推荐
- Stanford机器学习笔记-10. 降维(Dimensionality Reduction)
10. Dimensionality Reduction Content 10. Dimensionality Reduction 10.1 Motivation 10.1.1 Motivation ...
- Stanford机器学习笔记-2.Logistic Regression
Content: 2 Logistic Regression. 2.1 Classification. 2.2 Hypothesis representation. 2.2.1 Interpretin ...
- CF722D. Generating Sets[贪心 STL]
D. Generating Sets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- XML操作类
using System; using System.Data; using System.IO; using System.Xml; namespace DotNet.Utilities { ...
- IIS7.5上的REST服务的Put操作发生HTTP Error 405.0 - Method Not Allowed 解决方法
WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在I ...
- 关闭tomcat, 部署并启动tomcat的脚本
/opt/tomcat/bin/shutdown.sh rm -f /opt/tomcat/webapps/ibank.war rm -rf /opt/tomcat/webapps/ibank cp ...
- 理解java的finalize
基本预备相关知识 1 java的GC只负责内存相关的清理,所有其它资源的清理必须由程序员手工完成.要不然会引起资源泄露,有可能导致程序崩溃. 2 调用GC并不保证GC实际执行. 3 finalize抛 ...
- Standard Error of Mean(s.e.m.)
· 来源:http://www.dxy.cn/bbs/thread/6492633#6492633 6楼: “据我所知,SD( standard deviation )反应的是观测值的变异性,其表示平 ...
- ASP.NET 单点登陆
第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...
- CSS3 3D骰子
z zz zz zzzz zzzzz zzzzzz