利用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卻耗費了半天的時間,其中不乏對語法的查閱,功能的查找,確實來之不易,但願給讀者帶來效率,下面是實現效果圖:

附錄:轉載本博客,請註明出處,維護版權,人人有責。
相關文章
相關標籤/搜索