利用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)
- class HomeViewController: UIViewController,RegisterDelegate {
- var nameLbl : UILabel!
- var numTF : UITextField!
- override func viewDidLoad() {
- super.viewDidLoad()
- // Do any additional setup after loading the view.
- self.view.backgroundColor = UIColor.whiteColor()
- let titleItem : UINavigationItem = UINavigationItem(title: "首页")
- let NVC : UINavigationBar = UINavigationBar(frame: CGRectMake(0, 20, 320, 44))
- NVC.setItems([titleItem], animated: true)
- self.view.addSubview(NVC)
- numTF = UITextField(frame: CGRectMake(10, 100, 300, 35))
- numTF.placeholder = "输入学号"
- numTF.borderStyle = UITextBorderStyle.Line
- numTF.textAlignment = NSTextAlignment.Center
- numTF.clearButtonMode = UITextFieldViewMode.WhileEditing
- self.view.addSubview(numTF)
- nameLbl = UILabel()
- nameLbl.frame = CGRectMake(10, 150, 300, 40)
- nameLbl.text = ""
- nameLbl.backgroundColor = UIColor.lightGrayColor()
- nameLbl.textAlignment = NSTextAlignment.Center
- self.view.addSubview(nameLbl)
- let registerBtn : UIButton = UIButton()
- registerBtn.frame = CGRectMake(10, 200, 300, 40)
- registerBtn.backgroundColor = UIColor.lightGrayColor()
- registerBtn.setTitle("注册", forState: UIControlState.Normal)
- registerBtn.addTarget(self, action: "registerClick:", forControlEvents: UIControlEvents.TouchUpInside)
- self.view.addSubview(registerBtn)
- }
注意导航栏代码,以及各种UI的代码,很奇葩的写法,目前笔者只适配320的,没有做别的,大家可自行适配,这样一个首页UI就创建出来了,接着实现点击事件:
- func goRegister(){
- if numTF.text.isEmpty {
- var alert : UIAlertView = UIAlertView(title: "不能为空", message: "填写你的学号", delegate: nil, cancelButtonTitle: "知道了")
- alert.show()
- numTF.becomeFirstResponder()
- }else{
- var rootVC :RegisterViewController = RegisterViewController()
- let NVC :UINavigationController = UINavigationController(rootViewController: rootVC)
- self.presentViewController(NVC, animated: true, completion: nil)
- }
- }
这样就到了注册页面(RegisterViewController.swift),现在贴下注册页面代码:
- class RegisterViewController: UIViewController,UITextFieldDelegate{
- var nameTF : UITextField!
- var num : String!
- override func viewDidLoad() {
- super.viewDidLoad()
- // Do any additional setup after loading the view.
- self.view.backgroundColor = UIColor.whiteColor()
- self.title = "注册"
- let leftItem : UIBarButtonItem? = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "back")
- self.navigationItem.leftBarButtonItem = leftItem
- let numLbl : UILabel = UILabel()
- numLbl.frame = CGRectMake(10, 100, 300, 40)
- numLbl.text = self.num
- numLbl.backgroundColor = UIColor.lightGrayColor()
- numLbl.textAlignment = NSTextAlignment.Center
- self.view.addSubview(numLbl)
- nameTF = UITextField(frame: CGRectMake(10, 150, 300, 35))
- nameTF.placeholder = "输入姓名"
- nameTF.textAlignment = NSTextAlignment.Center
- nameTF.borderStyle = UITextBorderStyle.Line
- nameTF.clearButtonMode = UITextFieldViewMode.WhileEditing
- nameTF.delegate = self
- self.view.addSubview(nameTF)
- var submitBtn : UIButton = UIButton(frame: CGRectMake(10, 210, 300, 40))
- submitBtn.backgroundColor = UIColor.lightGrayColor()
- submitBtn.setTitle("确定", forState: UIControlState.Normal)
- submitBtn.addTarget(self, action: "submitClick:", forControlEvents: UIControlEvents.TouchUpInside)
- self.view.addSubview(submitBtn)
- }
这里有个取消按钮,其他和首页一样,实现点击确认代码:
- func submitClick(sender : UIButton)
- {
- goBack()
- }
- func goBack(){
- if nameTF.text.isEmpty {
- var alert : UIAlertView = UIAlertView(title: "不能为空", message: "填写你的名字", delegate: nil, cancelButtonTitle: "知道了")
- alert.show()
- nameTF.becomeFirstResponder()
- }else{
- self.dismissViewControllerAnimated(true, completion: { () -> Void in
- println("我要确定了,你知道吗?");
- })
- }
- }
- //MARK: TFDELEGATE
- func textFieldShouldReturn(textField: UITextField) -> Bool {
- goBack()
- return true
- }
- override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
- self.view.endEditing(true)
- }
这里代码也可注意了,多了一个点击view取消所以编辑响应事件
到这里页面之间就能相互切换进入了,具体的代码确实非常的不同,其中的swift语法和UI语法自行学习啦
三,创建协议
在HomeViewController 文件里面编写代码如下:
- import UIKit
- protocol RegisterDelegate{
- func registerName(name : NSString)
- }
- class HomeViewController: UIViewController,RegisterDelegate {
- var nameLbl : UILabel!
- var numTF : UITextField!
- ........
注意要实现这个协议,然后实现协议方法如下:
- func registerName(name: NSString) {
- nameLbl.text = name
- }
了解object-C的朋友应该很明白这个步骤了,再这之前我们要在被委托的页面去实现一个协议对象,代码如下:
- import UIKit
- class RegisterViewController: UIViewController,UITextFieldDelegate{
- var nameTF : UITextField!
- var delegate : RegisterDelegate!
- var num : String!
- override func viewDidLoad() {
- super.viewDidLoad()
- .....
注意这里的delegate,这就是协议委托对象,说白了就是要把之前的home页面这个对象传值过来赋予delegate,而delegate又遵循了协议,所以当delegate调用协议里面方法的时候就会再home页面里面由home来执行这个方法的实现过程,这样能达到把注册页面的值传到首页来显示的效果,这就是协议和委托配合使用的好处,好了,如果大家看到这里晕头了,请接着放下看,先不要管这句话了,我们回到home看看怎么设置代理的,代码如下,顺便看看我正向把学号传到注册页面去的代码:
- func goRegister(){
- if numTF.text.isEmpty {
- var alert : UIAlertView = UIAlertView(title: "不能为空", message: "填写你的学号", delegate: nil, cancelButtonTitle: "知道了")
- alert.show()
- numTF.becomeFirstResponder()
- }else{
- var rootVC :RegisterViewController = RegisterViewController()
- rootVC.delegate = self;
- rootVC.num = self.numTF.text
- let NVC :UINavigationController = UINavigationController(rootViewController: rootVC)
- self.presentViewController(NVC, animated: true, completion: nil)
- }
- }
然后我们再回到注册页面看看这个委托者到底在什么地方调用了协议方法:
- func goBack(){
- if nameTF.text.isEmpty {
- var alert : UIAlertView = UIAlertView(title: "不能为空", message: "填写你的名字", delegate: nil, cancelButtonTitle: "知道了")
- alert.show()
- nameTF.becomeFirstResponder()
- }else{
- self.delegate!.registerName(self.nameTF.text)
- self.dismissViewControllerAnimated(true, completion: { () -> Void in
- println("我要确定了,你知道吗?");
- })
- }
- }
注意不同点啊,就是在不为空这里将姓名传递到协议方法的参数里面带到首页来显示,实现了一个回调传值的功能。
如果完成前面的几个步骤,你就可以测试是否能相互传值了,如果成功了,你可以休息休息了,下面就简单提下AppDelegate.swift里面我是怎么写的,注意啊,我把默认的ViewController.swift创建完成后删除了啊
- var window: UIWindow?
- func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
- // Override point for customization after application launch.
- self.window?.rootViewController = HomeViewController()
- return true
- }
第四步,纯代码替换Main.storyboard文件,先删除Main.storyboard
代码如下:
- var window: UIWindow?
- func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
- // Override point for customization after application launch.
- self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
- self.window?.backgroundColor = UIColor.whiteColor()
- self.window?.makeKeyAndVisible()
- self.window?.rootViewController = HomeViewController()
- return true
- }
这样就等于是纯代码来实现了全部代码
第五步,修改显示名称
由于Xcode6 没有了InfoPlist.strings文件,这个你需要创建一个同名文件,又因为在info文件里面缺失了key:Bundle display name,这又要你手动添加,然后在InfoPlist.strings文件里面写入同Xcode5 一样的代码:
- "CFBundleDisplayName" = "学号注册";
至此我们就实现了最初设定的全部功能,可以说这也是笔者的一次摸索,如此简单的一个demo却耗费了半天的时间,其中不乏对语法的查阅,功能的查找,确实来之不易,希望给读者带来效率,如需代码,加下面QQ群可索取,实现效果图:
http://blog.csdn.net/mapboo/article/details/39643195
利用Swift之协议语法实现页面间的传值功能的更多相关文章
- 使用Block来进行页面间的传值
Block语法 定义Block //定义类型 typedef void (^ReceiveMessageBlock)(NSString *); //申明变量 ReceiveMessageBlock t ...
- HTML5 Web存储 页面间进行传值
在实际使用过程中,经常会遇到需要在页面间进行传值的情况,最初设想一定需要后端才能进行数据的存储和读取,或者在本地使用一个cookie进行保存,直到了解到HTML5 Web存储 使用HTML5的新特性可 ...
- B/S结构中页面间的传值
常见的页面间的传值有session,cookie,application,server.transfer(),queryString,今天主要记录一下server.transfer()的用法. 从A页 ...
- jsp页面间的传值方法
JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp? ...
- JSP页面间的传值方法总结
JSP 页面间传递参数是项目中经常需要的,这应该算是 web 基本功吧.试着将各种方式总结下来,需要时可以进行权衡利弊选择最合适的方式.下面来一起看看详细的介绍: 1. URL 链接后追加参数 ? 1 ...
- MVC 页面间的传值
关于MVC页面之间的传值,有多种方式,下面,我们就Html.RenderAction 方式 和 Html.RenderPartial 方式 来给大家分享一下有什么不同. 一.Html.RenderAc ...
- 从UWP到SWIFT-页面间反向传值
页面1跳转到页面2,在页面2点击button后,页面1的内容被改变.实际使用 protocol(就是c#中的interface),将页面1的viewcontroller转换为protocol传入页面2 ...
- vue项目各页面间的传值
githut地址:https://github.com/liguoyong/vueobj1 一.父子之间主键传值:(主要是在父主件里的子主件传递参数,然后再子主件里用props接收) 例如Father ...
- laravel页面间的传值
可以在前端页面元素上添加onclick事件 onclick='selectRaw(this)' js中写function selectRaw(obj){ var data=$(obj).attr(& ...
随机推荐
- codeforces 707D-(DFS+bitset)
题目链接:http://codeforces.com/contest/707/problem/D 根据询问建立一棵树然后DFS. #include<bits/stdc++.h> using ...
- hdu 3635
http://acm.hdu.edu.cn/showproblem.php?pid=3635 1-n个城市,对应放着编号1-n的龙珠. 两种操作 T A B 把编号A的龙珠所在城市内的全部龙珠放到有编 ...
- 【转】BAT及各大互联网公司2014前端笔试面试题:JavaScript篇
原文转自:http://blog.jobbole.com/78738/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习前端基础更是 ...
- 解决DatePicker中Appbar icon缺失
最近写了个小程序,用到了Microsoft.Phone.Controls.Toolkit里的DatePicker控件,引入以后发现AppBar里两个button的图标不显示.如下图: 们是“完成”和“ ...
- 中级iOS开发面试题
1:MVC的理解 MVC设计模式考虑三种对象:数据模型对象,视图对象和控制器对象. 数据模型:负责存储.定义.操作数据: 视图:展示数据给用户,和用户进行操作交互: 控制器:M与V的协调者,控制获取数 ...
- Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量
1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成 ...
- C++学习笔记6:多文件编程
1.添加文件到工程中: 2.函数调用时需要前向声明;以下为实例: //add.cpp int add(int x, int y) { return (x + y); } //main.cpp #inc ...
- 微软官方好用的Office 2003、 Office 2007 或 Office 2010 卸载工具
http://support.microsoft.com/kb/2519420/zh-cn
- 13年7月memory point
IOS/android美术资源压缩相关工具使用,shell编写; 美术资源地图压缩方案: IAP支付objc代码添加, iap cracker/iap free防破解方法, sever端增加php验证 ...
- mysql保存中文乱码的原因和解决办法
当你遇到这个mysql保存中文乱码问题的时候,期待找到mysql保存中文乱码的原因和解决办法这样一篇能解决问题的文章是多么激动人心. 也许30%的程序员会选择自己百度,结果发现网友已经贴了很多类 ...