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中定义很灵活,可根据程序逻辑看在哪里定义更合理
个人理解,不妥勿喷,请赐教。