利用Swift之协议语法实现页面间的传值功能

随着Swift 新开发语言的发布,又随着Xcode6.0.1的正式发布,利用swift编写iOS代码迫在眉睫,笔者在使用Objective-C开发近三年以来,对这种优雅的语法深感赞叹,下面我将对比式的实现一个页面传值的demo,使用语法是swift,页面传值是学习iOS初期必修的demo,因为涉及一个非常难懂的语法:协议和委托,这里涉及的swift语法和一些基本操作我不在一一赘述,如果方便可下载IT面试宝典APP,里面有对其详细介绍,那就开门见山吧,用代码实现以下功能:

1,创建Swift工程,可以使用XIB或纯代码,这里主要纯代码,大家会注意到这个奇怪的语言没有了.h文件,而是以.swift的文件

2,修改手机屏幕上的显示名称,这个和XCODE5 严重的不同,不知道是后退还是前进,笔者表示很无语,后面看看怎么恢复吧

3,基本的swift语法来定义:协议,正向传值和反向传值,即回调

4,简单的提下如何把XIB默认的改成纯代码,即删除XIB文件

5,页面功能是首页输入学号,然后点击注册,模态呈现注册页面,此时显示了上一个页面填入的学号,接着输入姓名后点击确定,返回上个页面显示名称

就这么多吧,下面来具体实现下,如果是新手可以照着步骤来做,遇到不明白的语法,请自行百度:

一,创建工程,总体代码结构如下图:

啥也不说了,进入下一步

二,纯代码构建首页面(HomeViewController.swift)和注册页面(RegisterViewController.swift)

[javascript] view plaincopyprint?

  1. class HomeViewController: UIViewController,RegisterDelegate {
  2. var nameLbl : UILabel!
  3. var numTF : UITextField!
  4. override func viewDidLoad() {
  5. super.viewDidLoad()
  6. // Do any additional setup after loading the view.
  7. self.view.backgroundColor = UIColor.whiteColor()
  8. let titleItem : UINavigationItem = UINavigationItem(title: "首页")
  9. let NVC : UINavigationBar = UINavigationBar(frame: CGRectMake(0, 20, 320, 44))
  10. NVC.setItems([titleItem], animated: true)
  11. self.view.addSubview(NVC)
  12. numTF = UITextField(frame: CGRectMake(10, 100, 300, 35))
  13. numTF.placeholder = "输入学号"
  14. numTF.borderStyle = UITextBorderStyle.Line
  15. numTF.textAlignment = NSTextAlignment.Center
  16. numTF.clearButtonMode = UITextFieldViewMode.WhileEditing
  17. self.view.addSubview(numTF)
  18. nameLbl = UILabel()
  19. nameLbl.frame = CGRectMake(10, 150, 300, 40)
  20. nameLbl.text = ""
  21. nameLbl.backgroundColor = UIColor.lightGrayColor()
  22. nameLbl.textAlignment = NSTextAlignment.Center
  23. self.view.addSubview(nameLbl)
  24. let registerBtn : UIButton = UIButton()
  25. registerBtn.frame = CGRectMake(10, 200, 300, 40)
  26. registerBtn.backgroundColor = UIColor.lightGrayColor()
  27. registerBtn.setTitle("注册", forState: UIControlState.Normal)
  28. registerBtn.addTarget(self, action: "registerClick:", forControlEvents: UIControlEvents.TouchUpInside)
  29. self.view.addSubview(registerBtn)
  30. }

注意导航栏代码,以及各种UI的代码,很奇葩的写法,目前笔者只适配320的,没有做别的,大家可自行适配,这样一个首页UI就创建出来了,接着实现点击事件:

[objc] view plaincopyprint?

  1. func goRegister(){
  2. if numTF.text.isEmpty {
  3. var alert : UIAlertView = UIAlertView(title: "不能为空", message: "填写你的学号", delegate: nil, cancelButtonTitle: "知道了")
  4. alert.show()
  5. numTF.becomeFirstResponder()
  6. }else{
  7. var rootVC :RegisterViewController = RegisterViewController()
  8. let NVC :UINavigationController = UINavigationController(rootViewController: rootVC)
  9. self.presentViewController(NVC, animated: true, completion: nil)
  10. }
  11. }

这样就到了注册页面(RegisterViewController.swift),现在贴下注册页面代码:

[objc] view plaincopyprint?

  1. class RegisterViewController: UIViewController,UITextFieldDelegate{
  2. var nameTF : UITextField!
  3. var num : String!
  4. override func viewDidLoad() {
  5. super.viewDidLoad()
  6. // Do any additional setup after loading the view.
  7. self.view.backgroundColor = UIColor.whiteColor()
  8. self.title = "注册"
  9. let leftItem : UIBarButtonItem? = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "back")
  10. self.navigationItem.leftBarButtonItem = leftItem
  11. let numLbl : UILabel = UILabel()
  12. numLbl.frame = CGRectMake(10, 100, 300, 40)
  13. numLbl.text = self.num
  14. numLbl.backgroundColor = UIColor.lightGrayColor()
  15. numLbl.textAlignment = NSTextAlignment.Center
  16. self.view.addSubview(numLbl)
  17. nameTF = UITextField(frame: CGRectMake(10, 150, 300, 35))
  18. nameTF.placeholder = "输入姓名"
  19. nameTF.textAlignment = NSTextAlignment.Center
  20. nameTF.borderStyle = UITextBorderStyle.Line
  21. nameTF.clearButtonMode = UITextFieldViewMode.WhileEditing
  22. nameTF.delegate = self
  23. self.view.addSubview(nameTF)
  24. var submitBtn : UIButton = UIButton(frame: CGRectMake(10, 210, 300, 40))
  25. submitBtn.backgroundColor = UIColor.lightGrayColor()
  26. submitBtn.setTitle("确定", forState: UIControlState.Normal)
  27. submitBtn.addTarget(self, action: "submitClick:", forControlEvents: UIControlEvents.TouchUpInside)
  28. self.view.addSubview(submitBtn)
  29. }

这里有个取消按钮,其他和首页一样,实现点击确认代码:

[objc] view plaincopyprint?

  1. func submitClick(sender : UIButton)
  2. {
  3. goBack()
  4. }
  5. func goBack(){
  6. if nameTF.text.isEmpty {
  7. var alert : UIAlertView = UIAlertView(title: "不能为空", message: "填写你的名字", delegate: nil, cancelButtonTitle: "知道了")
  8. alert.show()
  9. nameTF.becomeFirstResponder()
  10. }else{
  11. self.dismissViewControllerAnimated(true, completion: { () -> Void in
  12. println("我要确定了,你知道吗?");
  13. })
  14. }
  15. }
  16. //MARK: TFDELEGATE
  17. func textFieldShouldReturn(textField: UITextField) -> Bool {
  18. goBack()
  19. return true
  20. }
  21. override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
  22. self.view.endEditing(true)
  23. }

这里代码也可注意了,多了一个点击view取消所以编辑响应事件

到这里页面之间就能相互切换进入了,具体的代码确实非常的不同,其中的swift语法和UI语法自行学习啦

三,创建协议

在HomeViewController 文件里面编写代码如下:

[objc] view plaincopyprint?

  1. import UIKit
  2. protocol RegisterDelegate{
  3. func registerName(name : NSString)
  4. }
  5. class HomeViewController: UIViewController,RegisterDelegate {
  6. var nameLbl : UILabel!
  7. var numTF : UITextField!

[objc] view plaincopyprint?

  1. ........

注意要实现这个协议,然后实现协议方法如下:

[objc] view plaincopyprint?

  1. func registerName(name: NSString) {
  2. nameLbl.text = name
  3. }

了解object-C的朋友应该很明白这个步骤了,再这之前我们要在被委托的页面去实现一个协议对象,代码如下:

[objc] view plaincopyprint?

  1. import UIKit
  2. class RegisterViewController: UIViewController,UITextFieldDelegate{
  3. var nameTF : UITextField!
  4. var delegate : RegisterDelegate!
  5. var num : String!
  6. override func viewDidLoad() {
  7. super.viewDidLoad()

[objc] view plaincopyprint?

  1. .....

注意这里的delegate,这就是协议委托对象,说白了就是要把之前的home页面这个对象传值过来赋予delegate,而delegate又遵循了协议,所以当delegate调用协议里面方法的时候就会再home页面里面由home来执行这个方法的实现过程,这样能达到把注册页面的值传到首页来显示的效果,这就是协议和委托配合使用的好处,好了,如果大家看到这里晕头了,请接着放下看,先不要管这句话了,我们回到home看看怎么设置代理的,代码如下,顺便看看我正向把学号传到注册页面去的代码:

[objc] view plaincopyprint?

  1. func goRegister(){
  2. if numTF.text.isEmpty {
  3. var alert : UIAlertView = UIAlertView(title: "不能为空", message: "填写你的学号", delegate: nil, cancelButtonTitle: "知道了")
  4. alert.show()
  5. numTF.becomeFirstResponder()
  6. }else{
  7. var rootVC :RegisterViewController = RegisterViewController()
  8. rootVC.delegate = self;
  9. rootVC.num = self.numTF.text
  10. let NVC :UINavigationController = UINavigationController(rootViewController: rootVC)
  11. self.presentViewController(NVC, animated: true, completion: nil)
  12. }
  13. }

然后我们再回到注册页面看看这个委托者到底在什么地方调用了协议方法:

[objc] view plaincopyprint?

  1. func goBack(){
  2. if nameTF.text.isEmpty {
  3. var alert : UIAlertView = UIAlertView(title: "不能为空", message: "填写你的名字", delegate: nil, cancelButtonTitle: "知道了")
  4. alert.show()
  5. nameTF.becomeFirstResponder()
  6. }else{
  7. self.delegate!.registerName(self.nameTF.text)
  8. self.dismissViewControllerAnimated(true, completion: { () -> Void in
  9. println("我要确定了,你知道吗?");
  10. })
  11. }
  12. }

注意不同点啊,就是在不为空这里将姓名传递到协议方法的参数里面带到首页来显示,实现了一个回调传值的功能。

如果完成前面的几个步骤,你就可以测试是否能相互传值了,如果成功了,你可以休息休息了,下面就简单提下AppDelegate.swift里面我是怎么写的,注意啊,我把默认的ViewController.swift创建完成后删除了啊

[objc] view plaincopyprint?

  1. var window: UIWindow?
  2. func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
  3. // Override point for customization after application launch.
  4. self.window?.rootViewController = HomeViewController()
  5. return true
  6. }

第四步,纯代码替换Main.storyboard文件,先删除Main.storyboard

代码如下:

[objc] view plaincopyprint?

  1. var window: UIWindow?
  2. func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
  3. // Override point for customization after application launch.
  4. self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
  5. self.window?.backgroundColor = UIColor.whiteColor()
  6. self.window?.makeKeyAndVisible()
  7. self.window?.rootViewController = HomeViewController()
  8. return true
  9. }

这样就等于是纯代码来实现了全部代码

第五步,修改显示名称

由于Xcode6 没有了InfoPlist.strings文件,这个你需要创建一个同名文件,又因为在info文件里面缺失了key:Bundle display name,这又要你手动添加,然后在InfoPlist.strings文件里面写入同Xcode5 一样的代码:

[objc] view plaincopyprint?

  1. "CFBundleDisplayName" = "学号注册";

至此我们就实现了最初设定的全部功能,可以说这也是笔者的一次摸索,如此简单的一个demo却耗费了半天的时间,其中不乏对语法的查阅,功能的查找,确实来之不易,希望给读者带来效率,如需代码,加下面QQ群可索取,实现效果图:

http://blog.csdn.net/mapboo/article/details/39643195

时间: 2024-08-28 09:41:53

利用Swift之协议语法实现页面间的传值功能的相关文章

B/S结构中页面间的传值

常见的页面间的传值有session,cookie,application,server.transfer(),queryString,今天主要记录一下server.transfer()的用法. 从A页面Transfer到B页面时,就可以在B页面通过Context.Handler获得A页面的一个类的实例,从而在B调用A的各个成员对象. 下面的示例建立了AA和BB, 通过Server.Transfer()方法演示在BB中读取AA的文本框.读取属性.通过Context传值.调用AA的方法等. AA上放

父页面与子页面间相互传值

父页面与子页面间相互传值 1.子页面又父页面通过window.open弹出 子页面要向父页面传值,只要在document前面加window.opener即可.如:父页面: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

用block实现两个页面间的传值

第二个view声明一个block属性: @property (nonatomic, copy) void(^doTransferMsg)(NSString *_msg); 然后传值方法里检查block是不是存在 - (IBAction)transferText:(UIButton *)sender { if (_doTransferMsg) { _doTransferMsg(@"hello there"); _doTransferMsg = nil; } [self.navigatio

HTML5 Web存储 页面间进行传值

在实际使用过程中,经常会遇到需要在页面间进行传值的情况,最初设想一定需要后端才能进行数据的存储和读取,或者在本地使用一个cookie进行保存,直到了解到HTML5 Web存储 使用HTML5的新特性可以在本地存储用户的浏览数据.Web 存储需要更加的安全与快速. 这些数据不会被保存在服务器上,数据只用于用户请求网站数据上.它也可以存储大量的数据,而不影响网站的性能. 数据以“键/值”对存在, web网页的数据只允许该网页访问使用 方法: localStorage 和 sessionStorage

jsp页面间的传值方法

JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp?action=transparams&detail=directe">直接传递参数< /a> 特别的在使用response.sendRedirect做页面转向的时候,也可以用如下代码: response.sendRedirect("thexuan.jsp?acti

基于HTML5之APP页面间的传值的几种方式

一 摘要 在做APP开发时,避免不了出现两个页面之间的传值,在iOS开发中两个页面传值常见的有:属性传值,block,代理,通知等方式.那么web程序两个页面传值的形式有哪些呢,在这里我给大家总结一下. 1)PC版的web程序 两个两个页面之间的传值方式主要有: 1.cookie 2.查询字符串 3.还可以通过服务端的session来交换数据 2)HTML之app的传值方式 主要有: 1.HTML5 LocalStorage 本地存储 2.隐藏字段 3.服务器端的session等 4..页面已创

从UWP到Swift-页面间反向传值

页面1跳转到页面2,在页面2点击button后,页面1的内容被改变.实际使用 protocol(就是c#中的interface),将页面1的viewcontroller转换为protocol传入页面2的viewcontroller,非常类似于我们在c#中开发将_viewController转成接口传入其他自定义控件等中,实际就是在页面2放置一个引用,在swift里面这种做法叫委托,c#中也有. 这种思路应该是面向接口编程的一种体现,利用接口进行解开耦合.我现在能慢慢明白,其实swift之中的vi

laravel页面间的传值

可以在前端页面元素上添加onclick事件  onclick='selectRaw(this)' js中写function selectRaw(obj){ var data=$(obj).attr("name"); window.location.href='../../video/audit/'+data; } 然后在页面二获取url中的data,<?php echo $data ?> 其他传值方法见http://my.oschina.net/jiec/blog/1961

mvc页面间的传值

本文大致讲解mvc前后端的传值方式,包括control向view.view向control.以及action向action. 回顾 我们回顾下在ASP.NET WebForms中,页面之间最常用的传值方式,有以下几种: a). QueryString(也叫URL传值) b). Session c). Cookie d). Application e). Server.Transfer 这里不再讲述这几种传值方式的用法和利弊,在本章后面将用MVC的传值方式与之对比,并展开一些探讨.(webform