IOS开发之协议和代理
生活随笔
收集整理的這篇文章主要介紹了
IOS开发之协议和代理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【iOS開發技術分享】協議與代理
【iOS開發技術分享】協議與代理一、理解協議與代理
協議:
協議是一個方法簽名的列表,在其中可以定義若干個方法。根據配置,遵守該協議的類會去實現這個協議中規定的若干個方法。
代理:
代理是一個概念,很難用一個名詞去定義(如我們可以說協議其實就是一個方法列表)。它更像是一種關系,我要做某一個事情,但我自己不想去做這件事,我委托其他人幫我去做這件事。這個時候,這位其他人就是我的代理。
二、協議的使用
在定義協議時,可以通過@required與@optional來配置遵守這個協議必須去實現的方法和可以選擇的方法。譬如:
@protocol MyChooseDayViewDelegate<NSObject>??
@required??
- returnChooseDay:(id)myChooseDayView;??
@optional??
- hideThisView;??
- changeDateFormatter:(NSString*)formatString;??
@end??
在定義的協議 MyChooseDayViewDelegate中,如果遵守該協議,就必須實現協議中的- returnChooseDay: 方法,同時可以根據實際程序要求去實現- hideThisView 與 - changeDateFormatter: 。
同時,協議支持對本身的一種擴展,譬如:
@protocol MyChooseTimeViewDelegate< MyChooseDayViewDelegate>??
- doSomething;?
@end??
MyChooseTimeViewDelegate擴展了MyChooseDayViewDelegate這個協議,也就是說,假如遵守了MyChooseTimeViewDelegate的話,也必須實現MyChooseDayViewDelegate中的方法(@required)使用分類的話,就是在定義類的頭文件中使用<> 將所需要的協議引入,如果引入多個協議,用","分隔,譬如:
@interface MyClassView:UIViewController <MyChooseDayViewDelegate, UIAlertViewDelegate>??
//TODO: balabalabala...??
@end??
想要檢查某個類是否實現了某個協議或者某個類是否實現了某個協議的方法,可以通過以下方式來進行測試
//獲取某個對象??
MyClassView *myClassView = xxxxxxx;??
//判斷該對象是否實現了MyChooseDayViewDelegate協議??
if([myClassView conformToProtocol:@protocol (MyChooseDayViewDelegate)]){??
//TODO: balabalabala...??
}??
//判斷對象是否實現了某個方法就用我們經常會使用到的??
if([myClassView responseToSelector:@selector(xxxx)]){??
//TODO: balabalabala...??
}??
三、代理
代理在iOS開發會被經常使用,而且代理的使用往往配合著協議。我重復一次我對他的理解,我要做某一個事情,但我自己不想去做這件事,我委托其他人幫我去做這件事。
舉例來說,我在辦公室里正在寫代碼,突然發現口很渴像喝瓶冰百事,但下樓是件麻煩的事情,我不愿意下樓。這個時候我想起小賣部可以商品加價2元就外送到家服務,我就打電話給小賣部,委托小賣部給我送一瓶水上來。這個時候,小賣部就是我的代理,我委托他幫買水并送上來。這個例子中小賣部是我的代理,商品加價2元外送到家服務就是商品買賣協議(這個叫法肯定不是最佳的,姑且這么叫吧)中的一個方法。
不要覺得麻煩,我們再最后理一遍,小賣部遵守商品買賣協議,我讓小賣部成為了我的代理,代替我完成了買瓶冰百事的事情。
以iOS開發的角度來說,UIViewController想使用一個tableview,需要遵守UITableviewDataSource,UITableViewDelegate這2個協議,同時設置tableview的代理為自身,才可以完整的實現Table。
四、代理與協議的使用
我盡可能的用代碼來進行描述,但首先需要進行一些context鋪墊
我想實現的功能:我要自定義一個View,這個view可能展示了我自己項目中特定的一些信息,它可能是若干控件的組合,譬如UITextField、UISwitch、UIDatePicker、balabalabala...我們姑且叫這個view為myInformationView??我在一個ViewController使用了這個view,為了方便,這個ViewController就叫myRootViewController。在使用這個myInformationView時,我需要即時的在myRootViewController獲取并做相應的處理。這是我想實現的功能。
接下來,就是開始寫代碼的時刻:
1.首先是一個protocol
#import <Foundation/Foundation.h>??
@class MyInformationView;??
??
@protocol MyInformatioViewDelegate<NSObject>??
@required??
@returnValueToShow:(MyInformationView*)myInformationView;??
??
@end??
2.MyInformationView
#import <UIKit/UIKit.h>??
??
@interface MyInformationView : UIView??
??
@property (nonatomic, strong) id<MyInformationViewDelegate> myDelegate;??
??
??
- (id)initWith......//初始化視圖的方法??
//所需要的屬性和方法根據實際需要再行添加??
@end??
#import "MyInformationView.h"??
@interface MyInformationView()??
??
@end??
@implementation MyInformationView??
@synthesize myDelegate = _myDelegate;??
??
//Todo: 處理一些初始化方法和其他一些事件??
??
// changeMyInformationData 是操作此view可能產生的數據變動。它可能是選擇器變動、點擊按鈕等等,但我們并不想在此view處理它,因為它的變動可能對調用此view的controller造成影響,所以...??
- (void) changeMyInformationData:(id)sender??
{??
????//TODO:數據變動....??
????if ([self.myDelegate respondsToSelector:@selector(returnValueToShow:)]) {??
????????????[self.myDelegate returnValueToShow:self];??
????????}??
}??
??
@end??
3.ViewController
這里就不寫代碼了,在頭文件中聲明此類遵守MyInformationViewDelegate協議。在實現文件(.m)中,調用MyinfomationView的時候,設置代理成自己,
MyInformation *myInfoView = [[MyInformation alloc] init.......];
myInfoView.myDelegate = self;
然后實現協議中要求實現的方法
- (void)returnValueToShow:(MyInformationView*)myInfoView??
{??
?? //TODO:做想做的事情??
}??
這樣就是一整套完整的代理與協議組合用法了。但其實代理與協議還可以做更多的事情,例如在頁面切換時(A頁面進入AA頁面)...通過傳入,使AA成A的代理,并對其進行操作來方便處理一些問題。以后找機會會陸續介紹。這篇文章就寫到這里,謝謝。
總結
以上是生活随笔為你收集整理的IOS开发之协议和代理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能优化算法应用:基于麻雀搜索优化K-m
- 下一篇: 【最优化导论】全局搜索算法