storyboard跳转和传值

用静态tableview简单写下storyboard的跳转和传值,工程结构很简单,如下:


all.png

然后连线跳转,这里采用两种方式:
1.连接cell到controller,不需要任何代码,点击cell跳转


show1.png

2.连接两个controller,代码控制什么时候跳转,比如对话框跳转,条件跳转等。当然segue要添加identifier,不然你怎么找到他。
show2.png
segue1.png

运行程序:点gender跳转成功,点age肯定没反应,因为并没有操作他。
viewcontroller中添加代码:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        switch indexPath.row {
        case 0:// storyboard中已控制跳转,当然你可不case它
            break;
            
        case 1:
            self.performSegueWithIdentifier("showAgeTableView", sender: nil)
            break;
            
        default:
            break;
            
        }
    }

storyboard中segue的identifier在这里用。OK,两个种跳转都实现了。performSegueWithIdentifier可以像pushViewController一样在你需要的时候使用。
接下来传值,把RootViewController中cell的text分别传到GenderViewController和AgeViewController中作为title显示.
在GenderViewController和AgeViewController中分别增加变量genderTitle和ageTitle,并在viewdidload中设为title。RootViewController中实现函数:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        
    }

在这里做逻辑判断:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let vc = segue.destinationViewController
        switch vc {
        case is GenderViewController:
            
            break;
        case is AgeViewController:
            
            break;
        default:
            break;
        }
    }

因为GenderViewController的跳转实在storyboard中从tableviewcell中直接连线过去的,那么它的sender是该cell。所以可以这样写:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let vc = segue.destinationViewController
        switch vc {
        case is GenderViewController:
            (vc as! GenderViewController).genderTitle = (sender as! UITableViewCell).textLabel?.text
            break;
        case is AgeViewController:
            
            break;
        default:
            break;
        }
    }

而AgeViewController是通过performSegueWithIdentifier跳转的,而且当时是这样写的:

self.performSegueWithIdentifier("showAgeTableView", sender: nil)

sender传了空,现在来改一下,sender的类型随便,可以是任何view,也可以是string:

self.performSegueWithIdentifier("showAgeTableView", sender: tableView.cellForRowAtIndexPath(indexPath)?.textLabel?.text)

那么:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let vc = segue.destinationViewController
        switch vc {
        case is GenderViewController:
            (vc as! GenderViewController).genderTitle = (sender as! UITableViewCell).textLabel?.text
            break;
        case is AgeViewController:
            (vc as! AgeViewController).ageTitle = sender as! String
            break;
        default:
            break;
        }
    }

只要别忘记写self.title = xxoo,应该是title已经改变了。

然后是返回传值,同样是直接跳转和代码跳转。
把GenderViewController和AgeViewController中选中的text返回给RootViewController并写到相应的detailTextLabel中:
RootViewController中添加函数:

    @IBAction func saveUserInfo(segue: UIStoryboardSegue) {
        
    }

然后拉线,两个cell都拉到Exit,然后选selection segue是点击cell。(accessory action是点击cell里后面的叹号)


back1.png

action.png

到这里就可以实现GenderViewController点击cell返回了,如果要返回数据,在GenderViewController继续添加跳转时的函数:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let viewController: UIViewController = segue.destinationViewController
        (viewController as! ViewController).gender = (sender as! UITableViewCell).textLabel?.text
    }

sender也是用cell直接连过去的,类型可以直接强转。这样就传过去了。
然后在RootViewController中拿到值并且操作:

    @IBAction func saveUserInfo(segue: UIStoryboardSegue) {
        l_gender.text = gender;
    }

OK搞定,再看代码跳转,比如AgeViewController里cell很多,一个个拉线累成狗,直接连接AgeViewController到Exit,选saveUserInfo,同样需要给连线添加Identifier:

back2.png
addId.png

然后在AgeViewController中点击cell时操作:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        self.performSegueWithIdentifier("saveAge", sender: tableView.cellForRowAtIndexPath(indexPath))
    }

根据Identifier找到segue并且把sender设置为被点击的cell
RootViewController中逻辑判断:

    @IBAction func saveUserInfo(segue: UIStoryboardSegue) {
        let vc = segue.sourceViewController
        switch vc {
        case is GenderViewController:
            if (gender != nil){
                l_gender.text = gender;
            }
            break;
        case is AgeViewController:
            if (age != nil){
                l_age.text = age;
            }
            break;
        default:
            break;
        }
    }

OK,全部完成,过于简单就不发完整程序了。
总结下大概实现过程:
1、通过Identifier找到segue
2、通过segue.destinationViewController和segue.sourceViewController可以拿到连接segue的目标controller和来源controller
3、通过两个controller的全局变量来传值,至于变量在哪个controller中定义很灵活,可根据程序逻辑看在哪里定义更合理

个人理解,不妥勿喷,请赐教。

推荐阅读更多精彩内容