首页 存档 技术 查看内容

iOS移动开发图书连载40:以模态方式弹出视图控制器

2018-3-30 13:00 |来自: 互联网 328 0

摘要: 酷课堂(ID:coolketang)独家文章,其他媒体转载请注明出处。 这是《iOS移动开发从入门到精通》在“酷课堂”连载的第40篇文章,每周二更新,欢迎大家留言交流。 加小课好友:coolketang001 获取最新课程信息、每日 ...

酷课堂(ID:coolketang)独家文章,其他媒体转载请注明出处。


这是《iOS移动开发从入门到精通》在“酷课堂”连载的第40篇文章,每周二更新,欢迎大家留言交流。

加小课好友:coolketang001

获取最新课程信息、每日交流群问答分享...更多功能等你来解锁。


初次写书,难免会有不足的地方,希望大家可以多多批评指正,感谢!个人邮箱:[email protected]


纸质书现已在京东、当当、亚马逊等各大书城上市,

搜索“清华大学 李发展”即可找到。






6.1.3以模态方式弹出视图控制器

在iOS开发中,您会经常遇到以模态方式显示的视图控制器,如UIImagePickerController。当以模态方式打开UIImagePickerController时,用户在新打开的页面中选择所需的图片,然后再通过dismiss方法关闭弹出的UIImagePickerController。

使用模态方式展示视图控制器,主要用于以下两个场合:

v 收集用户输入的数据:比如用户点击区域按钮,以模态的方式显示省、市区域列表,使用户在新的页面进行省、市的选择;

v 显示临时信息:比如用户点击注册协议按钮,以模态的方式临时显示用户协议内容;


这里我们将创建了一个新的视图控制器,并以模态的方式显示新的视图控制器,同时向新的视图控制器中传递数据。


首先使用6-1-2中的方法,创建一个基于[Single View Application]模板的项目,同时创建一个新的视图控制器类,项目创建完成后,效果如图6-1-15所示:


图6-1-15



修改初始视图控制器

接着在ViewController.swift中,添加一个按钮,当用户点击按钮时,以模态的方式弹出另一个视图控制器,同时向该视图控制器中传入参数:


1import UIKit

2

3class ViewController:UIViewController {

4

5var label:UILabel!

6

7override func viewDidLoad() {

8super.viewDidLoad()

9self.view.backgroundColor =UIColor.brown()

10label = UILabel(frame: CGRect(x: 40, y:100, width: 240, height: 44))

11label.text = ""

12self.view.addSubview(label)

13

14let button = UIButton(frame: CGRect(x:40, y: 180, width: 240, height: 44))

15button.setTitle("打开新的视图控制器", for: UIControlState())

16button.backgroundColor =UIColor.black()

17button.addTarget(self, action:#selector(ViewController.openViewController), for: .touchUpInside)

18self.view.addSubview(button)

19}

20

21func openViewController()

22{

23let newViewController =NewViewController()

24newViewController.labelTxt = "传递的参数!"

25newViewController.viewController = self

26self.present(newViewController,animated: true, completion: nil)

27}

28}



在第5行的代码中,给视图控制器类添加了一个UILabel标签属性,该标签用来显示从模态窗口中返回的数据。

在第9至12行的代码中,首先设置当前视图控制器根视图的背景颜色为棕色,然后对label属性进行初始化操作,设置label的默认文字为无,并将标签添加到根视图中。

接着在第14至18行的代码中,创建了一个UIButton按钮对象,同时设置按钮的标签文字和背景颜色。在第17行代码中,给按钮绑定了点击事件,当用户点击该按钮时,将调用相应的方法,在该方法中打开相应的视图控制器。

最后在第21至26行的代码中,创建了一个名为openViewController的方法,用来响应按钮的点击事件。首先在第23行的代码中,创建了一个NewViewController的实例。然后在第24行代码中,设置实例的labelTxt字符串属性的值。在第25行代码中,设置viewController属性为当前的视图控制器,该属性将被用来从模态视图控制器,向当前的视图控制器中返回数据。

在第26行的代码中,调用当前视图控制器实例的present(newViewController:, animated:, completion:)方法,以模态的方式显示新的视图控制器。该方法的第一个参数,表示需要打开的视图控制器实例,第二个参数表示是否以动画的方式打开视图控制器,第三个参数表示视图控制器被打开后的回调方法。




修改新的视图控制器

接着修改NewViewController.swift文件,您将在该类中添加一个标签对象的属性,用来显示从前一个视图控制器传递进来的数据。还需要添加一个按钮对象,当用户点击该按钮时,退出当前的视图控制器,并返回原来的视图控制器,同时向原来的视图控制器返回数据:

1import UIKit

2

3class NewViewController:UIViewController {

4

5var viewController : ViewController?

6var labelTxt = ""

7override func viewDidLoad() {

8super.viewDidLoad()

9self.view.backgroundColor =UIColor.purple()

10let label = UILabel(frame: CGRect(x:40, y: 100, width: 240, height: 44))

11label.text = labelTxt

12self.view.addSubview(label)

13

14let button = UIButton(frame: CGRect(x:40, y: 180, width: 240, height: 44))

15button.setTitle("关闭", for: UIControlState())

16button.backgroundColor =UIColor.black()

17button.addTarget(self, action:#selector(NewViewController.dismissSelf), for: .touchUpInside)

18self.view.addSubview(button)

19}

20

21func dismissSelf()

22{

23viewController?.label.text = "返回的参数。"

24self.dismiss(animated: true,completion: nil)

25}

26}




首先在第5至6行代码中,给NewViewController类添加了两个属性,一个是viewController属性,用来表示弹出当前视图控制器的源视图控制器。另一个字符串属性labelTxt,表示从源视图控制器中传进来的数据。

接着在第9至12行代码中,依次设置了当前视图控制器根视图的背景颜色为紫色,并创建了一个UILabel标签对象,用来显示从源视图控制器传递进来的数据labelTxt的内容。

然后在第14至18行的代码中,创建了一个UIButton对象,并设置按钮上标签的文字内容为关闭,背景颜色为黑色。同时在第17行代码中,给按钮绑定了点击事件,当用户点击按钮时,将退出当前的视图控制器,并返回源视图控制器。

最后在第21至25行的代码中,创建了一个名为dismissSelf的方法。在该方法中,首先设置了源视图控制器中的标签对象的文字内容,然后调用视图控制器对象的dismiss(animated:, completion:)方法,退出当前的视图控制器,并返回源视图控制器。该方法的第一个参数,表示是否以动画的方式,退出视图控制器,第二个参数则表示视图控制器退出完毕后的回调方法。

代码编写完成后,点击[编译并运行]按钮,打开模拟器运行项目,效果如图6-1-16所示。在打开的模拟器中,点击[打开新的视图控制器]按钮,新的视图控制器将从底部滑入,滑入后的状态如图6-1-17所示。并且在[关闭]按钮上方的标签中,显示了从源视图控制器传入的数据。


接着点击[关闭]按钮,新的视图控制器将从上往下滑出,并返回源视图控制器,同时将源视图控制器中的标签对象的文字内容设置为[返回的参数],如图6-1-18所示:


图6-1-16 图6-1-17 图6-1-18





新课程发布:

《iOS开发中的神兵利器》已经在网易云课堂上线,点击“阅读原文”即可观看。


本套视频教程总140节,主要讲解github中近百个过千star的iOS热门开源项目,以及其它进阶内容。


这是市面上唯一大规模讲解github中热门的iOS开发开源项目的教材。


学会这些开源项目,可以快速、优雅地解决现实工作中遇到的一些棘手的开发问题。



付费学员专享福利:

(额外福利,不承诺永久提供!)

1.为了更好的交流,近期我们开设了QQ群

2.已购买课程的同学,请添加小课微信号:coolketang001

3.截图订单号,即可获取对应QQ群号,及免费练习源码。


加小课:coolketang001,获取最新课程信息、每日交流群问答分享...更多功能等你来解锁。






想开发自己的APP?

想及时获得解答?

想接触更多技术大牛?

扫码关注我们就对了!

埋头自学是不行的,你需要同学和老师!





如果觉得文章对你有帮助,请转发分享,谢谢你!









声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部