淺談Objective-C代理方案
Objective-C代理方案是本文要介紹的內(nèi)容。通過一個ViewController控制著AView和BView,這樣的一個實(shí)例來介紹內(nèi)容,我們先來看詳細(xì)內(nèi)容。
現(xiàn)在要實(shí)現(xiàn):AView中點(diǎn)擊切換到BView,BView中點(diǎn)擊又切換回AView中,并把Bview刪除或隱藏。
由于對模式不是很清楚,所以沒想到用什么模式處理,如果有什么好的模式可以解決上述問題,希望大俠們指教哇。
最后使用的方法是objective-c的代理。
1、在BView.h中定義一個代理:
- id delegate; // A delegate that wants to act on events in this view
2、定義代理方法,這里使用到的是objective-c 的協(xié)議
- @interface NSObject ( BViewDelegate)
- -(void)delegateMethod;
- @end
注:以上寫的協(xié)議為非正式的,所以,不用被設(shè)置代理者,不實(shí)現(xiàn)這個代理方法也是可以的。
3、在點(diǎn)擊中實(shí)現(xiàn)代碼中,調(diào)用代理者實(shí)現(xiàn)的代理方法。在BView.m中添加如何類似
代碼:
//設(shè)置了代理者,且代理者實(shí)現(xiàn)了
- delegateMethod
- if(delegate && [delegate respondsToSelector:@selector(delegateMethod)])
- delegate delegateMethod];
4、在AViem.m中設(shè)置BView的代理,并實(shí)現(xiàn)delegateMethod方法即可:
類似初始化中添加:[aView setDelegate:self];
- -(void)delegateMethod{
- //control bView code here
- ...
- }
另外,關(guān)于正式協(xié)議:
- @protocol protocolName
- @optional -(void)delegateMethodA
- @required -(void)delegateMethodB
- // other methods
- ...
- @end
正式協(xié)議類似于java的借口或抽象類。@optional 的方法,可實(shí)現(xiàn)也可不實(shí)現(xiàn),但@required 的方法必需實(shí)現(xiàn)。默認(rèn)為@required。
正式協(xié)議要求在代理類中聲明采納此代理,如:
- @interface ClassName: NSObject <ProtocolName>
- //...
- @end
另外,在調(diào)用特殊代理方法前,需要通過conformsToProtocol函數(shù)來判斷代理對
象是否遵守定義的協(xié)議,如:
- if([mydelegate conformsToProtocol:@protocol(protocolName)])
- {
- [mydelegate delegateMethod];
- }
或者使用
- respondsToSelector:@selector
來判斷代理對象是否實(shí)現(xiàn)相應(yīng)的方法。
小結(jié):淺談Objective-c代理方案的內(nèi)容介紹完了,希望本文對你有所幫助!