• <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>

            厚積薄發(fā),滴水穿石

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

            Objective-C中委托和協(xié)議

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

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

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

            定義一個(gè)類A:

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

            定義一個(gè)類B,在B中定義類A的實(shí)例為B中的成員變量:

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

            下面在mai()函數(shù)中實(shí)現(xiàn)委托機(jī)制:

            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. }?

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

            下面再寫一種實(shí)現(xiàn)方式,這樣方式更接近于我們通常見到的用協(xié)議還實(shí)現(xiàn)的方式:

            我們還是定義一個(gè)類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. 現(xiàn)在我們不用main()函數(shù),在B的實(shí)現(xiàn)部分來實(shí)現(xiàn)委托機(jī)制: ?
            8. ?
            9. @implement?B ?
            10. -(void)callPrint{ ?
            11. [self.delegate?print]; ?
            12. } ?
            13. @end?

            上面這種實(shí)現(xiàn)方式和第一種其實(shí)是一樣的,只是第一種是在第三方函數(shù)調(diào)用委托方法。delegate是id類型,本例中就是A類的一個(gè)實(shí)例,當(dāng)然可以調(diào)用A類中的print。第二種方式不存在第三方函數(shù),是在B類中調(diào)用 A類中的方法。或者說,B中需要print方法,自己不實(shí)現(xiàn),讓A來實(shí)現(xiàn),自己調(diào)用 。

            再接下來就是最常見的用協(xié)議實(shí)現(xiàn)委托的方式,說明如下:

            protocol-協(xié)議,就是使用了這個(gè)協(xié)議后就要按照這個(gè)協(xié)議來辦事,協(xié)議要求實(shí)現(xiàn)的方法就一定要實(shí)現(xiàn)。

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

            當(dāng)一個(gè)A view 里面包含了B view

            b view需要修改a view界面,那么這個(gè)時(shí)候就需要用到委托了。

            需要幾個(gè)步驟

            1、首先定一個(gè)協(xié)議

            2、a view實(shí)現(xiàn)協(xié)議中的方法

            3、b view設(shè)置一個(gè)委托變量

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

            5、事件發(fā)生后,用委托變量調(diào)用a view中的協(xié)議方法

            例子:

            1. B_View.h: ?
            2. @protocol?UIBViewDelegate?<NSObject>?
            3. @optional ?
            4. -?(void)ontouch:(UIScrollView?*)scrollView;?//聲明協(xié)議方法 ?
            5. @end ?
            6. @interface?BView?:?UIScrollView<UIScrollViewDelegate>?
            7. { ?
            8. id<?UIBViewDelegate?>?_touchdelegate;?//設(shè)置委托變量 ?
            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];?//調(diào)用協(xié)議委托 ?
            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;?//設(shè)置委托 ?
            39. [self.view?addSubview:?m_BView]; ?
            40. } ?
            41. -?(void)ontouch:(UIScrollView?*)scrollView ?
            42. { ?
            43. ???//實(shí)現(xiàn)協(xié)議 ?
            44. }?

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

            久久综合日本熟妇| 久久精品免费网站网| 久久青青草原精品国产软件 | 国产精品内射久久久久欢欢| 亚洲人成精品久久久久| 噜噜噜色噜噜噜久久| 色综合久久中文字幕综合网| 性高湖久久久久久久久AAAAA| 国产亚洲精午夜久久久久久| 国产午夜精品理论片久久| 久久福利青草精品资源站免费 | 久久综合九色综合欧美狠狠| 久久久噜噜噜久久熟女AA片| 九九久久自然熟的香蕉图片| 日韩乱码人妻无码中文字幕久久| 久久综合香蕉国产蜜臀AV| 国产精品99久久99久久久| 久久久久国产一级毛片高清版| 办公室久久精品| 久久人人爽人人澡人人高潮AV| 欧美精品丝袜久久久中文字幕 | 97精品国产91久久久久久| 精品久久久久久无码专区不卡| 久久91精品国产91久久小草| 狠狠精品久久久无码中文字幕| 久久综合一区二区无码| 亚洲综合熟女久久久30p| 99久久精品午夜一区二区| 国产成人精品久久亚洲高清不卡| 久久狠狠一本精品综合网| 国产精品乱码久久久久久软件| 人妻无码αv中文字幕久久| 26uuu久久五月天| 国产免费久久精品99re丫y| 精品国产VA久久久久久久冰| 久久国产午夜精品一区二区三区| 久久人人爽人人爽人人片AV高清 | 精品久久久久久久久久中文字幕 | 国产精品久久久久久久久| 久久精品国产第一区二区| 香蕉久久夜色精品升级完成|