Swift - 纯代码实现页面segue跳转,以及参数传递
(本文代码已升级至Swift4)
下面通过一个例子说明如何在代码中进行segue页面的切换,以及参数的传递。



5,详情页面代码 DetailViewController.swift
源码下载:
hangge_720.zip
下面通过一个例子说明如何在代码中进行segue页面的切换,以及参数的传递。
样例功能如下:
1,主界面中是一个列表(这个列表是在代码中实现)
2,点击列表项时,界面会切换到详情页面,同时传递改列表项的值到详细页面。
效果图如下:


实现步骤:
1,在storyboard中拖入一个新的 ViewController 用做详情页面,同时创建一个继承ViewController的新类 DetailViewController。并将其与storyboard中新建的详情页面进行视图与控制器的绑定。

2,在storyboard中,选中详情页面,通过最上方的Detail View Controller拖拽到主页面进行segue关联(show detail)
(右键点击 Detail View Controller 头部黄色的标志,在出现的菜单中选择“show detail”旁边的圆圈,在圆圈上按住左键拖动到主页面)

关联后如下:

3,选中关联线,设置segue的 Identifier 属性为“ShowDetailView”


4,主界面代码 ViewController.swift
import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { var ctrlnames:[String] = ["任务1","任务2","任务3"] var tableView:UITableView? override func loadView() { super.loadView() } override func viewDidLoad() { super.viewDidLoad() //创建表视图 self.tableView = UITableView(frame: self.view.frame, style:.plain) self.tableView!.delegate = self self.tableView!.dataSource = self //创建一个重用的单元格 self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "cell1") self.view.addSubview(self.tableView!) } //在本例中,只有一个分区 func numberOfSections(in tableView: UITableView) -> Int { return 1 } //返回表格行数(也就是返回控件数) func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.ctrlnames.count } //创建各单元显示内容(创建参数indexPath指定的单元) func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { //为了提供表格显示性能,已创建完成的单元需重复使用 let identify:String = "cell1" //同一形式的单元格重复使用,在声明时已注册 let cell = tableView.dequeueReusableCell(withIdentifier: identify, for: indexPath) as UITableViewCell cell.accessoryType = .disclosureIndicator cell.textLabel?.text = self.ctrlnames[indexPath.row] return cell } // UITableViewDelegate 方法,处理列表项的选中事件 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.tableView!.deselectRow(at: indexPath, animated: true) let itemString = self.ctrlnames[indexPath.row] self.performSegue(withIdentifier: "ShowDetailView", sender: itemString) } //在这个方法中给新页面传递参数 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "ShowDetailView"{ let controller = segue.destination as! DetailViewController controller.itemString = sender as? String } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
5,详情页面代码 DetailViewController.swift
import UIKit class DetailViewController: UIViewController { var itemString:String? @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() textField.text = itemString } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }注:如果想在详细页中返回主页面,可以在详细页中添加一个返回按钮,按钮响应代码如下:
//返回到上一个页面 self.presentingViewController!.dismiss(animated: true, completion: nil)
源码下载:

我稍稍改动成了点击按钮跳转,但是显示Thread 1: signal SIGABRT。。。请问这是为什么
searchbtn.addTarget(self, action:#selector(tapped(_:)), for:.touchUpInside)
self.view.addSubview(searchbtn)
@objc func tapped(_ button:UIButton){
self.performSegue(withIdentifier: "search", sender: self)
我用这个方法想传一个image给第二个页面,, 我这样写的controller.TestView.image = self.HuiTu.image出现这个错误是怎么回事?Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value,初学者纠结这个问题好久了,感谢
谢谢航哥!
站长,麻烦问一下拿dismiss关闭页面的时候怎么传值给上个页面啊,我刚开始学,谢谢
站长你好,有没有不实现页面跳转只传递参数的方法
航哥按你的办法,prepareForSegue 方法会调用两次。
站长,想问,撇开storyboard,用Swift,纯代码能创建一个segue吗?连那些连线都不做。
站长,为什么prepareForSegue方法里let controller = segue.destinationViewController as! DetailViewController这个会先走一遍数据为空的
站长,我写了个跳转,但是有个地方不对,想问问站长
我照着您的方法:A页面->B页面传值,这个过程没有问题ok。
但是我从A页面->B导航控制器->B页面,因为我b页面加了个nav,所以就不对了,这个有没有什么办法改一下啊
12八成是因为吧auto layout 关了吧,这样就不显示show和show detail了
因为找不到 show detail ,所以航哥如果不用连接直接跳转用代码写segue和delegate行吗? 可是我写的传回来一直是nil…
航哥,问个问题,我在tab bar上使用这个,跳转页面就没有了这个tabbar,怎么解决呢
第三部确定设置了的,还是报错doesn't contain a view controller with identifier 'UIViewController
请问下 为什么我的textField无法显示传递过来的itemString的值
航哥,我跳转报错了,错误是has no segue with identifier 'ShowDetailView''
站长 ,如果用不同的storyboard进行的跳转,没有identifier,该如何传值呢?
我过去之后怎么回来啊? 还是同样的办法回来么? 有那种回到上个页面的方法么 不用navigationbar
Presenting Segues下的页面切换方式,只能通过拉线来建立么?能通过代码实现么?
谢谢,站长回复!非常感谢。。支持你哦~
谢谢,帮了大忙!
站长 , 我在xcode7中的storyboard找不到实现步骤第二步中的 show detail 的segue,我连接不了两个界面。求救
我是来点赞的!