iOS開發-委託(Delegate)淺談

來源:互聯網
上載者:User

iOS開發-委託(Delegate)淺談
委託其實並不是OC中才有,C#中也有,不過彼此的理解方式是不一樣的,OC中委託是協議的一種,需要使用@protocol聲明,委託一般在iOS開發中頁面中傳值用的比較多。委託是Cocoa中最簡單、最靈活的模式之一,委託其實字面上的意思就是將需要的事情委託給別人做,業務情境可以參考主視圖和子視圖之間的頁面關係,或者是視圖層和資料層之間的互動。 簡單的委託 委託通過@protocol聲明,可以定義方法,引用委託的對象,需要實現其方法,方法預設都是@required的,同時可以設定為可選的@optional,首先定義個委託: otocol BookDelegate <NSObject>@required- (void)getBookCount;@optional- (void)optionMethod; @end   這個時候定義書籍Book類和客戶Customer類:  @interface Book : NSObject<BookDelegate> @end @interface Customer : NSObject<BookDelegate> @property (assign,nonatomic) id<BookDelegate> didBookDelegate; @end 實現其中的getBookCount方法:  @implementation Book - (void)getBookCount{    NSLog(@"Book中getBookCount的實現");} @end @implementation Customer - (void)getBookCount{    NSLog(@"Customer中getBookCount的實現");} @end簡單的調用:  Book *book=[[Book alloc]init]; Customer *customer=[[Customer alloc]init]; [customer getBookCount]; [book getBookCount];  上面幾行的代碼的結果,不用說大家也能看的懂,接下來看接下來的代碼,這個時候大家發現用到了開始頂一個的didBookDelegate: customer.didBookDelegate=book; [customer.didBookDelegate getBookCount]; 上面就是將Book的執行個體,Book實現了BookDelegate,這個時候可將Book的執行個體賦值給customer中的變數,將自己的執行個體化對象委託給了didBookDelegate。 以上是委託使用基本的情境,作為執行個體化對象book可以自己執行其方法,也可以通過委託將執行過程轉移。 頁面傳值 簡單的就是A頁面資料可以傳值給B頁面,B頁面可以傳值給A頁面,簡單的兩個頁面傳值,頁面參考如下:   都是文字框和按鈕,跳轉方式選取的時Modal: 第一個頁面ViewController的定義:  #import <UIKit/UIKit.h>#import "SecondViewController.h"  @interface ViewController : UIViewController<StudySubjectDelegate> @property (strong, nonatomic) IBOutlet NSString *firstData;  @property (weak, nonatomic) IBOutlet UITextField *subjectName; @end 第二個頁面SecondViewController標頭檔的定義,並且聲明了一個委託:  ////  SecondViewController.h//  Sample////  Created by keso on 15/2/3.//  Copyright (c) 2015年 keso. All rights reserved.// #import <UIKit/UIKit.h> @class SecondViewController;@protocol StudySubjectDelegate <NSObject> - (void)shouldChangeValue:(SecondViewController*)controller; @end @interface SecondViewController : UIViewController @property (assign,nonatomic) id<StudySubjectDelegate> firstViewDelegate;  @property (weak, nonatomic) IBOutlet NSString *showData; @property (weak, nonatomic) IBOutlet UITextField *studySubject; @end ViewController.m中的點擊事件:  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{    if ([segue.identifier isEqualToString:@"firstEdit"]) {        SecondViewController *controller=segue.destinationViewController;        NSLog(@"%@",self.subjectName.text);        //將自己本身的執行個體傳遞給第二個視圖        controller.firstViewDelegate=self;        controller.showData=self.subjectName.text;    }} 賦值的方式還可以是這樣的,其實中的key就是第二個視圖定義的屬性:  if ([controller respondsToSelector:@selector(setShowData:)]) {    [controller setValue:self.subjectName.text forKey:@"showData"];}第二個頁面的點擊事件就比較簡單了,代碼如下: 1[self.firstViewDelegate shouldChangeValue:self];上面中其實可以簡單的看到oc中的委託就是將自己的執行個體交給其他對象的成員變數,然後由其成員變數執行執行個體的工作,的今天不知道為什麼有點頭疼,說個事情就是最後的第二個頁面跳轉到一個頁面可以接收到值,無法給UITextField賦值,暫時沒有搞明白如何才能賦值上去,每次進入就變成了null,有知道可以指點一下,多謝~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.