新しい開発言語 Swift のリリースと Xcode 6.0.1 の正式リリースにより、3 年近く Objective-C を使用した開発を経て、Swift を使用して iOS コードを記述することが目前に迫っています。このエレガントな構文を使用して、ページ値転送のデモを比較して実装します。ページ値転送には、プロトコルと委任という非常に難しい構文が含まれるため、iOS の学習の初期段階では必須のデモです。ここで関係する Swift 構文と、基本的な操作については詳しく説明しません。必要に応じて、詳細な概要が記載されている IT インタビュー ガイド APP をダウンロードしてください。早速、コードを使用して実装してみましょう。次の関数:
1. Swift プロジェクトを作成します。ここで重要なのは、.h ファイルではなく、.swift ファイルであることに注意してください。
2. 電話画面の表示名を変更します。これは、戻るか戻るかわかりません。後で回復する方法を見てみましょう。定義する基本的な Swift 構文: プロトコル、順方向値転送および逆方向値転送、つまりコールバック
4. XIB をデフォルトのコードに変更する、つまり XIB ファイルを削除する方法について簡単に説明します5.ホームページで学生番号を入力し、「登録」をクリックすると、前のページで入力した学生番号が表示されます。名前を入力して「OK」をクリックします。前のページに移動して名前を表示します
以上です。具体的に実装してみましょう。初心者の場合は、次の手順に従ってください。
1. 作成します。プロジェクトの全体的なコード構造は次のとおりです:
何も言うことはありません、次のステップに進みましょう
次に、純粋なコードでホームページ (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) }
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) } }
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) }
ここでページを切り替えることができます。実際、Swift 構文と UI 構文は大きく異なります。
3 つ目は、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()
.....
ここでのデリゲートに注目してください。端的に言えば、これはホーム ページのオブジェクトです。デリゲートに値を渡し、デリゲートはプロトコルに従います。そのため、デリゲートがプロトコル内のメソッドを呼び出すと、このメソッドの実装プロセスがホーム ページのホームによって実行されます。これにより、登録ページの値を実現できます。効果はホームページに表示されます。これがプロトコルと委任を併用する利点です。これを見て混乱した場合は、とりあえずこの文を読んでください。ホームに戻って、プロキシを設定するコードは次のとおりです。
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) } }
次に、登録ページに戻り、クライアントがプロトコル メソッドを呼び出す場所を確認します。
空でない場合、名前がプロトコル メソッドのパラメータに渡されることに注意してください。そして、表示のためにホームページに移動され、コールバック値渡し関数が実装されます。
前の手順を完了したら、相互に値を転送できるかどうかをテストできます。成功した場合は、AppDelegate.swift でどのように記述したかを簡単に説明します。 . 注意してください。作成後にデフォルトの ViewController.swift を削除しました
4 番目のステップは、Main.storyboard ファイルを純粋なコードに置き換えることです
コードは次のとおりです。 :
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("我要确定了,你知道吗?"); }) } }
5 番目のステップは、表示名を変更することです
Xcode6 には InfoPlist.strings ファイルがないため、同じファイルを作成する必要がありますname、およびキー: バンドル表示名が情報ファイルにないため、これを手動で追加してから、InfoPlist.strings ファイルに Xcode5 と同じコードを記述する必要があります:
"CFBundleDisplayName" = "学号注册";
附录:转载本博客,请注明出处,维护版权,人人有责。