swift场转的几种方式及优缺点分析(慢慢更新)

原创
2016/04/19 15:59
阅读数 3.6K

一、弹出present:

优点:代码简洁,简单,使用灵活。

缺点:只能从下向上弹出新的页面,不能使用其他动画,比较古板。新窗口关闭时,也只能先进后出(即:现打开的后关闭,后打开的先关闭),不能任意关闭窗口。

适用场景:适合用来弹出『登陆』『注册』这种与其他页面关联度不大,使用次数又少的场景。

用法:

去:

let pvc = storyboard?.instantiateViewControllerWithIdentifier("public") as! ViewControllerPublic
self.presentViewController(pvc, animated: true, completion: {
            print("已经跳转了")
        })

 

回:

self.dismissViewControllerAnimated(true, completion: {
            print("正在关闭")
        })

 


二、跳转segue:

优点:上手难度低,在storyboard上拖拖拽拽就定义好了,是ios最基础的跳转方式。

缺点:只能用拖拽来静态定义,不支持动态定义,非常不灵活,遇到复杂一点的逻辑,比如动态生成100多个页面这种情况就不能用了。

适用场合:产品经理在演示时,即时定义达到演示效果。

详情:由于此方法太简单,所以就随便参考一下别人的吧,点击进入


三、导航navigation

优点:自由灵活,能定义多种样式、效果,是最专业也是使用最多的场转方式,每一个UIView的子类中都默认含有navigationController、navigationItem,可以看出官方也最推荐这种方式

缺点:定义复杂,内部组件多,区别模糊,代码和storyboard使用方式区别较大,难度较高,其实说到底,navigation就是对segue的封装,并且提供了一套对segue的管理方法。

适用场合:所有!

用法:

1、在AppDelegate的didFinishLaunchingWithOptions方法中定义一个UINavigationController。

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        let rootvc = window?.rootViewController
        let nav = UINavigationController(rootViewController: rootvc!)
        
        //获取主storyboard
        //let sb = UIStoryboard(name: "Main", bundle: nil)
        
        //设置返回按钮图标和标题的颜色
        nav.navigationBar.tintColor = UIColor.redColor()
        
        //设置导航栏的背景颜色
        nav.navigationBar.backgroundColor = UIColor.greenColor()
        nav.navigationBar.barTintColor = UIColor.redColor()//上面的不起作用就用这个
        
        //据说是设置什么透明度,我试了试没出效果
        nav.navigationBar.translucent = true
        
        //设置导航条的风格,这里系统一共就提供了3种风格,其中还有一种已经不推荐用了,所以这个功能基本就是废。
        //nav.navigationBar.barStyle = .Black
        
        //设置导航栏的背景图
        //nav.navigationBar.setBackgroundImage(UIImage(named: "xxx"), forBarMetrics: .Default)
        
        //最后一定要记得指定一下程序的入口页面(根视图)
        self.window?.rootViewController = nav
        
        return true
    }

 

2、在每个分页的ViewController中定义导航条的样式及按钮点击事件。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //设置当前页面的标题
        self.navigationItem.title = "第一页"
        
        //自定义导航条中间位置的可视化控件
        //self.navigationItem.titleView = UIView()

        //定制返回按钮,如修改返回按钮的tilte或者图标等,这里如果把某参数的值设为nil,系统会自动设为默认值
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
        
        //定义当前页面的navigationItem的右按钮
        let rbb = UIBarButtonItem(title: "关闭", style: UIBarButtonItemStyle.Done, target: self, action: #selector(ViewController.rbbClicked(_:)))
            //这里也可以使用系统内置的BarButtonItem,如:
            //let rbb = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "rbbClicked:")
        self.navigationItem.rightBarButtonItem = rbb
        
        //定义当前页面的navigationItem的左按钮(系统默认添加了一个带箭头的左按钮,一旦添加,就会替换系统自动生成的左按钮
        let lbb = UIBarButtonItem(title: "返回", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(ViewController.rbbClicked(_:)))
        self.navigationItem.leftBarButtonItem = lbb

    }

    func rbbClicked(sender:AnyObject){
        print("点了右边的按钮")
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

这里要明确一个非常非常有意思的问题,导航到第二个页面之后会看到页面左上部有一个back按钮,就是这个按钮,他并不属于当前页面,而是属于上一级页面!

有关NavigationBar的样式设计,请参考这里

四、页面返回的具体分析

1.对于present出来的页面,因为其打开方式就是自下而上的弹出,所以用self.dismissViewControllerAnimated(自上而下隐藏)最合适不过了。

2.对于segue出来的页面,也可以用self.dismissViewControllerAnimated来隐藏,但是明显不合适。

3.除了上述的办法,navigationController还提供了3种方法,且都是左右滑出的:

//返回到上一级页面
self.navigationController?.popViewControllerAnimated(true)

//返回到之前跳转过的 特定的 一个页面,注意这里的『navigationController?.viewControllers』这个数组中的元素是导航过程中的页面,也就是说在rootViewController调用,只能获取到navigationController?.viewControllers[0],而在第二个页面才可以获取到navigationController?.viewControllers[1]。
self.navigationController?.popToViewController((self.navigationController?.viewControllers[0])!, animated: true)

//直接返回到rootViewController
self.navigationController?.popToRootViewControllerAnimated(true)

 

 

 

 

展开阅读全文
打赏
1
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
1
分享
返回顶部
顶部