首先创建一个基于SIngle View App模版的项目如下图: 这里我命名为123: 结果如图所示:
同时创建一个新的视图控制类如下图: 右键点击状态栏中123文件夹,选择New File 在弹出的模版选择窗口中选择Cocoa Touch Class选项 创建新的视图控制类 点击Next,在下一步中我为新的类命名为NewViewController 并令UIViewController作为新建类的父类,语言选择Swift 创建好之后结果如下: 下面对视图控制器进行修改: 在ViewController.swift中添加一个按钮,当用户点击按钮时,以模态的方式弹出另一个视图控制器,同时向该视图控制器中传入参数(下面为修改过的ViewController.swift代码块以及注释):
import UIKit class ViewController: UIViewController { var label:UILabel! //给试图控制类添加了一个UILabel标签属性,该标签用来显示从模态窗口中返回的数据 override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.green //设置当前视图控制器根视图的背景颜色为绿色 label = UILabel(frame: CGRect(x:40,y:100,width:240,height:44))//对label进行初始化操作 label.text = "" //设置label默认文字为无 self.view.addSubview(label) //将标签添加到视图中 // Do any additional setup after loading the view, typically from a nib. let button = UIButton(frame: CGRect(x:40,y:180,width:240,height:44)) //创建UIButton按钮对象 button.setTitle("打开新的视图控制器",for:.normal)//同时设置按钮的标签文字 button.backgroundColor = UIColor.black//设置按钮的颜色 button.addTarget(self, action: #selector(ViewController.openViewController), for:.touchUpInside)//给按钮绑定了点击事件,当用户点击该按钮时,将调用相应的方法,即openViewController self.view.addSubview(button)//将标签添加到视图中 } @objc func openViewController(){ //创建了名为openViewController的方法,用来响应按钮的点击事件 let newViewController = NewViewController() //对NewViewController的实例 newViewController.labelTxt = "传递的参数 " //设置实例的labelTxt字符属性的值 newViewController.viewController = self //设置viewController属性为当前的视图控制器 //该属性将被用来从模态视图控制器向当前视图控制器返回数据 self.present(newViewController,animated: true,completion: nil)//调用当前视图控制器实例的present方法,第一个参数表示需要打开的视图控制器实例,第二个参数表示是否以动画的方式打开视图控制器,第三个参数表示视图控制器被打开后的回调方法 } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }下面对新的视图控制器进行修改: 添加一个标签对象的属性,用来显示前一个视图控制器传进来的数据,在NewViewController.swift中添加一个按钮,当用户点击按钮时,退出当前视图控制器,并返回原来的视图控制器,同时向原来的视图控制器中返回数据数(下面为修改过的NewViewController.swift代码块以及注释):
import UIKit class NewViewController: UIViewController { //给NewViewController类添加了两个属性 weak var viewController:ViewController? //viewController属性,用来表示弹出当前视图控制器的源视图控制器 var labelTxt = "" //表示从源视图控制器传进来的数据 override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.brown //设置背景颜色 // Do any additional setup after loading the view. let label = UILabel(frame: CGRect(x:40,y:100,width:240,height:44)) //创建UILabel对象, label.text = labelTxt //用来显示从源视图控制器传递进来的数据labelTxt的内容 self.view.addSubview(label) //将标签添加到视图中 let button = UIButton(frame: CGRect(x:40,y:180,width:240,height:44))//创建UIButton对象 button.setTitle("关闭", for: .normal) //并设置按钮上标签的文字内容为关闭, button.backgroundColor = UIColor.black//背景颜色为黑色 button.addTarget(self, action: #selector(NewViewController.dismissSelf), for: .touchUpInside) //设置点击事件,当用户点击按钮时,将退出当前的视图控制器,并返回源视图控制器 self.view.addSubview(button) //将按钮标签添加到视图中 } @objc func dismissSelf(){ //创建名为dismissSelf的方法 viewController?.label.text = " 返回的参数 " //设置源视图控制器中的标签对象的文字内容 self.dismiss(animated: true, completion: nil) //调用视图控制对象的dismiss(animated:,completion:,)方法退出当前的视图控制器,并返回源视图控制器 } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }代码编写完成后点击 按钮运行,效果图如下(这里以8P作为模型机来模拟的): 点击123App显示如下界面: 点击打开“新的视图控制器”按钮,进入下一界面,新的视图将从底部滑入,滑入后的状态如下图: 接着点击“关闭”按钮,新的视图控制器将从上往下滑出界面,并返回源视图控制器,同时将源视图控制器中标签对象的文字内容设置为“返回的参数”如下图所示: (参考书:IOS移动开发从入门到精通 第二版)