• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            厚積薄發,滴水穿石

            搬家到主站了:http://www.cnblogs.com/cokecoffe/
            隨筆 - 45, 文章 - 8, 評論 - 12, 引用 - 0
            數據加載中……

            Objective-C中委托和協議

            from:http://mobile.51cto.com/iphone-283416.htm

            Objective-C委托協議是本文要介紹的內容,委托協議是兩個概念,協議實際上相當于C++中的純虛類的概念,只定義并只能由其它類來實現。而委托類似于Java中的接口。(Objective-C實現委托這種機制是利用協議來實現的,這種說法我現在認為是不對的,理由下述:)。

            Objective-C委托和協議本沒有任何關系,協議如前所述,就是起到C++中純虛類的作用,對于“委托”則和協議沒有關系,只是我們經常利用協議還實現委托的機制,其實不用協議也完全可以實現委托。下面說明了實現方式:

            定義一個類A:

            1. @interface?A:NSObject ?
            2. -(void)print; ?
            3. @end ?
            4. @implement?A ?
            5. -(void)print{ ?
            6. } ?
            7. @end?

            定義一個類B,在B中定義類A的實例為B中的成員變量:

            1. @interface?B:NSObject{ ?
            2. ???????A?*a_delegate; ?
            3. } ?
            4. @end?

            下面在mai()函數中實現委托機制:

            1. void?main() ?
            2. { ?
            3. B?*b=[[B?alloc]init]; ?
            4. A?*a=[[A?alloc]init]; ?
            5. b.a_delegate=a; ?
            6. [b.a_delegate?print]; ?
            7. }?

            這樣,最基本的委托機制就完成了,套用最通俗的一句解釋:B需要完成一個print的操作,但他自己并沒有實現這個操作,而是交給了A去完成,自己只是在需要時調用A中實現的print操作。

            下面再寫一種實現方式,這樣方式更接近于我們通常見到的用協議還實現的方式:

            我們還是定義一個類A:

            1. @interface?A:NSObject{ ?
            2. B?*b; ?
            3. } ?
            4. -(void)print; ?
            5. @end ?
            6. @implement?A ?
            7. @synasize?delegate; ?
            8. -(void)viewDidLoad{ ?
            9. b=[[B?alloc]init]; ?
            10. b.delegate=self; ?
            11. } ?
            12. -(void)print{ ?
            13. NSLog(@"print?was?called"); ?
            14. } ?
            15. @end?

            然后類B的定義改成如下所示:

            1. @interface?B:NSObject{ ?
            2. id?delegate ?
            3. } ?
            4. @propert(nonamtic,retain)?id?delegate; ?
            5. @end ?
            6. ?
            7. 現在我們不用main()函數,在B的實現部分來實現委托機制: ?
            8. ?
            9. @implement?B ?
            10. -(void)callPrint{ ?
            11. [self.delegate?print]; ?
            12. } ?
            13. @end?

            上面這種實現方式和第一種其實是一樣的,只是第一種是在第三方函數調用委托方法。delegate是id類型,本例中就是A類的一個實例,當然可以調用A類中的print。第二種方式不存在第三方函數,是在B類中調用 A類中的方法。或者說,B中需要print方法,自己不實現,讓A來實現,自己調用 。

            再接下來就是最常見的用協議實現委托的方式,說明如下:

            protocol-協議,就是使用了這個協議后就要按照這個協議來辦事,協議要求實現的方法就一定要實現。

            delegate-委托,顧名思義就是委托別人辦事,就是當一件事情發生后,自己不處理,讓別人來處理。

            當一個A view 里面包含了B view

            b view需要修改a view界面,那么這個時候就需要用到委托了。

            需要幾個步驟

            1、首先定一個協議

            2、a view實現協議中的方法

            3、b view設置一個委托變量

            4、把b view的委托變量設置成a view,意思就是 ,b view委托a view辦事情。

            5、事件發生后,用委托變量調用a view中的協議方法

            例子:

            1. B_View.h: ?
            2. @protocol?UIBViewDelegate?<NSObject>?
            3. @optional ?
            4. -?(void)ontouch:(UIScrollView?*)scrollView;?//聲明協議方法 ?
            5. @end ?
            6. @interface?BView?:?UIScrollView<UIScrollViewDelegate>?
            7. { ?
            8. id<?UIBViewDelegate?>?_touchdelegate;?//設置委托變量 ?
            9. } ?
            10. @property(nonatomic,assign)?id<?UIBViewDelegate?>?_touchdelegate;? ?
            11. @end ?
            12. B_View.mm: ?
            13. @synthesize?_touchdelegate; ?
            14. -?(id)initWithFrame:(CGRect)frame?{ ?
            15. if?(self?=?[super?initWithFrame:frame])?{ ?
            16. //?Initialization?code ?
            17. _touchdelegate=nil; ?
            18. } ?
            19. return?self; ?
            20. } ?
            21. -?(void)?touchesBegan:(NSSet*)touches?withEvent:(UIEvent*)event ?
            22. { ?
            23. [super?touchesBegan:touches?withEvent:event]; ?
            24. if(_touchdelegate!=nil?&&?[_touchdelegate?respondsToSelector:?@selector(ontouch:)?]?==?true)? ?
            25. [_touchdelegate?ontouch:self];?//調用協議委托 ?
            26. } ?
            27. ?
            28. @end ?
            29. A_View.h: ?
            30. @interface?AViewController?:?UIViewController?<?UIBViewDelegate?>?
            31. { ?
            32. BView?*m_BView; ?
            33. } ?
            34. @end ?
            35. A_View.mm: ?
            36. -?(void)viewWillAppear:(BOOL)animated ?
            37. { ?
            38. m_BView._touchdelegate?=?self;?//設置委托 ?
            39. [self.view?addSubview:?m_BView]; ?
            40. } ?
            41. -?(void)ontouch:(UIScrollView?*)scrollView ?
            42. { ?
            43. ???//實現協議 ?
            44. }?

            posted on 2012-04-25 23:18 Wangkeke 閱讀(2850) 評論(0)  編輯 收藏 引用 所屬分類: IOS

            狠狠人妻久久久久久综合| 久久精品一区二区三区AV| 国产精品免费久久| 亚洲乱码日产精品a级毛片久久| 狠狠色综合网站久久久久久久高清 | 久久精品国产亚洲5555| 久久亚洲国产精品成人AV秋霞 | yy6080久久| 国产成人精品久久免费动漫| 欧美成a人片免费看久久| 亚洲精品无码专区久久久| 亚洲国产成人久久精品影视| 99久久香蕉国产线看观香| 91久久福利国产成人精品| 久久AV高潮AV无码AV| 国产免费久久精品丫丫| 99久久99久久久精品齐齐| 色天使久久综合网天天| 久久免费国产精品| 嫩草影院久久99| 韩国免费A级毛片久久| 国产成人精品综合久久久| 中文精品99久久国产| 久久久免费观成人影院| 国内精品欧美久久精品| 国产综合精品久久亚洲| 91精品日韩人妻无码久久不卡 | 久久久国产99久久国产一| 国产999精品久久久久久| 一本大道加勒比久久综合| 国产精品久久一区二区三区| 国产精品99久久精品| 欧美精品一区二区精品久久| 久久久久久综合一区中文字幕 | 国产成人精品免费久久久久| 婷婷久久香蕉五月综合加勒比| 久久久久久久久66精品片| 狠狠色婷婷久久一区二区 | 国产成人精品久久一区二区三区av| 国产日产久久高清欧美一区| 国产99精品久久|