首頁 web前端 html教學 利用Swift之协议语法实现页面间的传值功能_html/css_WEB-ITnose

利用Swift之协议语法实现页面间的传值功能_html/css_WEB-ITnose

Jun 24, 2016 am 11:57 AM
使用 功能 協定 文法 頁面

随着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 UIKitprotocol 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 UIKitclass 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群可索取,实现效果图:


附录:转载本博客,请注明出处,维护版权,人人有责。



本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vivox100s和x100區別:效能比較及功能解析 vivox100s和x100區別:效能比較及功能解析 Mar 23, 2024 pm 10:27 PM

vivox100s和x100手機都是vivo手機產品線中的代表機型,它們分別代表了vivo在不同時間段內的高端技術水平,因此這兩款手機在設計、性能和功能上均有一定區別。本文將從效能比較和功能解析兩個面向對這兩款手機進行詳細比較,幫助消費者更好地選擇適合自己的手機。首先,我們來看vivox100s和x100在效能上的比較。 vivox100s搭載了最新的

自媒體到底是什麼?它的主要特點和功能有哪些? 自媒體到底是什麼?它的主要特點和功能有哪些? Mar 21, 2024 pm 08:21 PM

隨著網路的快速發展,自媒體這個概念已經深入人心。那麼,自媒體到底是什麼呢?它有哪些主要特點和功能呢?接下來,我們將一一探討這些問題。一、自媒體到底是什麼?自媒體,顧名思義,就是自己就是媒體。它是指透過網路平台,個人或團隊可以自主創建、編輯、發布和傳播內容的資訊載體。不同於傳統媒體,如報紙、電視、電台等,自媒體具有更強的互動性和個人化,讓每個人都能成為訊息的生產者和傳播者。二、自媒體的主要特色和功能有哪些? 1.低門檻:自媒體的崛起降低了進入媒體產業的門檻,不再需要繁瑣的設備和專業的團隊,一部手

小紅書帳號管理軟體有哪些功能?怎麼經營小紅書帳號? 小紅書帳號管理軟體有哪些功能?怎麼經營小紅書帳號? Mar 21, 2024 pm 04:16 PM

隨著小紅書在年輕人中的流行,越來越多的人開始利用這個平台分享各方面的經驗和生活見解。如何有效管理多個小紅書帳號成為關鍵問題。在本文中,我們將討論一些小紅書帳號管理軟體的功能,並探討如何更好地經營小紅書帳號。隨著社群媒體的發展,許多人發現自己需要管理多個社群帳號。對於小紅書用戶來說,這也是一個挑戰。一些小紅書帳號管理軟體可以幫助使用者更輕鬆地管理多個帳號,包括自動發佈內容、定時發布、資料分析等功能。透過這些工具,使用者可以更有效率地管理他們的帳號,提高帳號的曝光率和關注。另一、小紅書帳號管理軟體有

PHP技巧:快速實現返回上一頁功能 PHP技巧:快速實現返回上一頁功能 Mar 09, 2024 am 08:21 AM

PHP技巧:快速實現回到上一頁功能在網頁開發中,常常會遇到需要實作返回上一頁的功能。這樣的操作可以提高使用者體驗,讓使用者更方便地在網頁之間進行導航。在PHP中,我們可以透過一些簡單的程式碼來實現這項功能。本文將介紹如何快速實現返回上一頁功能,並提供具體的PHP程式碼範例。在PHP中,我們可以使用$_SERVER['HTTP_REFERER']來取得上一頁的URL

什麼是Discuz? Discuz的定義與功能介紹 什麼是Discuz? Discuz的定義與功能介紹 Mar 03, 2024 am 10:33 AM

《探索Discuz:定義、功能及程式碼範例》隨著網路的快速發展,社群論壇已成為人們獲取資訊、交流觀點的重要平台。在眾多的社群論壇系統中,Discuz作為國內較知名的一種開源論壇軟體,備受廣大網站開發者和管理員的青睞。那麼,什麼是Discuz?它又有哪些功能,能為我們的網站提供怎樣的幫助呢?本文將對Discuz進行詳細介紹,並附上具體的程式碼範例,幫助讀者更

處理Laravel頁面無法正確顯示CSS的方法 處理Laravel頁面無法正確顯示CSS的方法 Mar 10, 2024 am 11:33 AM

《處理Laravel頁面無法正確顯示CSS的方法,需要具體程式碼範例》在使用Laravel框架開發Web應用程式時,有時候會遇到頁面無法正確顯示CSS樣式的問題,這可能會導致頁面呈現不正常的樣式,影響使用者體驗。本文將介紹一些處理Laravel頁面無法正確顯示CSS的方法,並提供具體的程式碼範例,幫助開發者解決這個常見問題。一、檢查檔案路徑首先要檢查CSS檔案的路徑是

3秒跳轉頁面實作方法:PHP程式指南 3秒跳轉頁面實作方法:PHP程式指南 Mar 25, 2024 am 10:42 AM

標題:3秒跳轉頁面實作方法:PHP程式設計指南在網頁開發中,頁面跳轉是常見的操作,一般情況下我們使用HTML中的meta標籤或JavaScript的方法進行頁面跳轉。不過,在某些特定的情況下,我們需要在伺服器端進行頁面跳轉。本文將介紹如何使用PHP程式實作一個在3秒內自動跳到指定頁面的功能,同時會給出具體的程式碼範例。 PHP實現頁面跳躍的基本原理PHP是一種在

PHP是做什麼用的?探究PHP的作用與功能 PHP是做什麼用的?探究PHP的作用與功能 Mar 24, 2024 am 11:39 AM

PHP是一種廣泛應用於Web開發的伺服器端腳本語言,它主要的功能是產生動態網頁內容,與HTML結合使用,可以創造出豐富多彩的網頁。 PHP的功能強大,它可以執行各種資料庫操作、檔案操作、表單處理等任務,為網站提供強大的互動性和功能性。在接下來的文章中,我們將進一步探究PHP的作用與功能,並配以詳細的程式碼範例。首先,我們來看看PHP的常見用途:動態網頁生成:P

See all articles