iOS页面跳转之Router的Swift实现逐步讲解,含Demo源代码下载

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看495 回复回复3 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 495|回复: 3
收起左侧

iOS页面跳转之Router的Swift实现逐步讲解,含Demo源代码下载

[复制链接]
攻城狮 发表于 2016-7-14 08:39:24 | 显示全部楼层 |阅读模式
快来登录
获取优质的苹果资讯内容
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
订阅梳理好了的知识点专辑
在app中页面跳转是无法回避的问题, 我们平常在代码中遇到跳转,基本都是:

[Swift] 纯文本查看 复制代码
let vc = UIViewController()
self.navigationController?.pushViewController(vc, animated: true)


后面出现了storyboard后可以通过连线进行跳转,传参通过:

[Swift] 纯文本查看 复制代码
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)


获取到要跳转的对象进行传参, 后来还有了Reference可以跳到不同的storyboard,不得不说这样真的方便,但个人感觉这样同时也有一个缺点就是不明确, 我在追踪的时候不容易跟踪, 自己写的过段时间忘了或者说后来人看你写的代码很难理解。

所以写了个简单的路由器, 现在网上也有类似的实现,比如HHRouterroutable-ios等。

iOS页面跳转之Router的Swift实现

iOS页面跳转之Router的Swift实现逐步讲解,含Demo源代码下载 - 敏捷大拇指 - iOS页面跳转之Router的Swift实现





1、基本要求

现有项目要用Swift, 所以做了个Swift版本的跳转,有以下基本需求:

  • 做到write once run anywhere;
  • 页面初始化支持code、xib、storyboard、传参;
  • 基本页面跳转(push、present),内部外部网页跳转,推送通知跳转;
  • 松耦合。


考虑到以上,写了个基本的Routable协议,如果这个ViewController要想支持跳转就必须实现这个协议。




2、Swift实现逐步讲解

协议中的两个方法:

一个是初始化, 一个是返回这个ViewController对应的key。

[Swift] 纯文本查看 复制代码
public protocol Routable {
 
/**
类的初始化方法
- params 传参字典
*/
static func initWithParams(params: RouterParam?) -> UIViewController
/**
每个类跳转对应的key
*/
static var routableKey:String { get }
}


同时在设置了根控制器之后,将此ViewController的key与类名进行对应起来:

[Swift] 纯文本查看 复制代码
let router = Router.sharedInstance
router.navigationController = nav
 
router.map(FirstViewController.routableKey, className: FirstViewController.description())
router.map(SecondViewController.routableKey, className: SecondViewController.description())
router.map(WebViewController.routableKey, className: WebViewController.description())
router.map(FirstNavigationController.routableKey, className: FirstNavigationController.description())


传参,由于Swift是强类型的,没办法,字典中用了Any做为Value:

[Swift] 纯文本查看 复制代码
public typealias RouterParam = [String: Any]


同时为了支持present时的动画效果,添加了RouterOptions来支持一些额外的效果或者要求:

[Swift] 纯文本查看 复制代码
public class RouterOptions {
    let presentationStyle: UIModalPresentationStyle
    let transitionStyle: UIModalTransitionStyle
    /** 只有在isModal为true是才会考虑modal下的style */
    var isModal = false
    /** 只对pushViewController有效 */
    var shouldOpenAsRoot = false
 
    public class func rootOptions() -> RouterOptions {
        return RouterOptions(presentationStyle: .FullScreen, transitionStyle: .CoverVertical, isModal: false, isRoot: true)
    }
 
    public class func modalOptions() -> RouterOptions {
        return RouterOptions(presentationStyle: .FullScreen, transitionStyle: .CoverVertical, isModal: true, isRoot: false)
    }
 
    public init(presentationStyle: UIModalPresentationStyle, transitionStyle: UIModalTransitionStyle, isModal: Bool) {
        self.presentationStyle = presentationStyle
        self.transitionStyle = transitionStyle
        self.isModal = isModal
    }
 
    public init(presentationStyle: UIModalPresentationStyle, transitionStyle: UIModalTransitionStyle, isRoot: Bool) {
        self.presentationStyle = presentationStyle
        self.transitionStyle = transitionStyle
        self.shouldOpenAsRoot = isRoot
    }
 
    private init(presentationStyle: UIModalPresentationStyle, transitionStyle: UIModalTransitionStyle, isModal: Bool, isRoot: Bool) {
        self.presentationStyle = presentationStyle
        self.transitionStyle = transitionStyle
        self.isModal = isModal
        self.shouldOpenAsRoot = isRoot
    }
}


调用open进入新界面,可以选择性的是否传入参数,动画效果, present时的options要求, push/present后的回调等。

[Swift] 纯文本查看 复制代码
private func open(key: String, params: RouterParam?, options: RouterOptions?, animated: Bool, completion: ((opened: UIViewController?) -> Void)?)
{
 
}


添加了基本的打电话,打开外部网页功能,打开外部app。




3、Demo源代码下载

同时写了基本的使用demo,详细代码见Router,需下载本帖附件,如下。

iOS页面跳转之Router的Swift实现逐步讲解,含Demo源代码下载 Router-master.zip.zip (43.79 KB, 下载次数: 0, 售价: 10 金钱)

都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

嗯,不错!期待更多好内容,支持一把:
支持敏捷大拇指,用支付宝支付10.24元 支持敏捷大拇指,用微信支付10.24元

评分

参与人数 1金钱 +10 贡献 +10 专家分 +10 收起 理由
Anewczs + 10 + 10 + 10 32个赞!专家给力!

查看全部评分

本帖被以下淘专辑推荐:

智能科技 发表于 2016-7-14 14:26:14 | 显示全部楼层
下载看看
瑶池 发表于 2016-7-14 14:49:55 | 显示全部楼层
路由器,还以为是硬件那个呢
fasoal 发表于 2016-7-16 16:30:20 | 显示全部楼层
先赞再看
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

做任务,领红包。
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励
关闭

站长推荐 上一条 /3 下一条

热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表