• <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 閱讀(2825) 評論(0)  編輯 收藏 引用 所屬分類: IOS

            国产午夜免费高清久久影院| 亚洲欧美国产精品专区久久| 日日狠狠久久偷偷色综合免费| 久久人人爽人人爽人人AV东京热 | 国产精品成人99久久久久 | 国产午夜免费高清久久影院 | 无码日韩人妻精品久久蜜桃 | 色综合久久中文综合网| 国产成人无码久久久精品一| 国产精品久久久福利| 97久久精品国产精品青草| 国内精品久久久久久99蜜桃| 99久久国产综合精品麻豆| 亚洲国产精品久久66| 精品国产青草久久久久福利 | 人妻无码αv中文字幕久久琪琪布| 久久久久亚洲AV成人网| 青春久久| 久久久久久久亚洲Av无码| 久久久久久毛片免费播放| 99久久精品费精品国产一区二区| 伊人久久大香线蕉影院95| 久久久久九九精品影院| 久久人人爽人人爽人人av东京热| 无码AV中文字幕久久专区| 午夜欧美精品久久久久久久| 丁香狠狠色婷婷久久综合| 精品久久久久久国产三级| 久久久久波多野结衣高潮| 国产美女久久久| 亚州日韩精品专区久久久| 久久久久久亚洲Av无码精品专口| 9191精品国产免费久久| 久久久久高潮综合影院| 精品国产一区二区三区久久蜜臀| 99久久国产亚洲综合精品| 青青草原1769久久免费播放| 无码国内精品久久综合88| 91精品国产综合久久香蕉| 看久久久久久a级毛片| 亚洲美日韩Av中文字幕无码久久久妻妇|