如何有条件地遵守委托协议?

时间:2015-07-23 20:28:09

标签: ios objective-c delegates

如果我在我的iOS项目中包含仅在(例如)iOS 9中可用的框架,但我仍然支持iOS 8,那么我如何根据iOS版本有条件地遵循委托协议?例如,我理解我可以像这样有条件地包含框架:

#import <Availability.h>
#ifdef __IPHONE_9_0
#import <Something/Something.h>
#endif

但是如果该框架还需要符合委托协议呢?

@interface ExampleController () <UITextViewDelegate, SomethingDelegate>

我如何只包括&#34; SomethingDelegate&#34;如果我在iOS 9上?

谢谢!

3 个答案:

答案 0 :(得分:2)

嗯,大致相同的方式:

@interface ExampleController () <UITextViewDelegate
#ifdef __IPHONE_9_0
     , SomethingDelegate
#endif
>

顺便说一下,这是你应该检查设备是否运行iOS 9 - this only checks if your Xcode supports iOS 9的方式。

答案 1 :(得分:0)

@Glorfindel的答案更干净,我会支持它,但只是为了得到一个替代答案。

#ifdef __IPHONE_9_0
    #import <Something/Something.h>
    #define DELEGATES UITextViewDelegate, SomethingDelegate
#else
    #define DELEGATES UITextViewDelegate
#endif

@interface ExampleController : UIViewController <DELEGATES>

还有一个问题,你打算如何使用属于SomethingDelegate协议的方法,#ifdef/#endif或只是保留它们&#34;就像#34;,因为它们永远不会被称为。

答案 2 :(得分:0)

对于具有自己文件的类别,这是一项很好的任务。这些文件的内容可以完全ifdef d out。

//ExampleController+SomethingDelegate.h
#ifdef __IPHONE_9_0

#import <Something/Something.h>

@interface ExampleController (SomethingDelegate) <SomethingDelegate>
@end
#endif
//ExampleController+SomethingDelegate.m
#import "ExampleController+SomethingDelegate.h"

#ifdef __IPHONE_9_0

@implementation ExampleController (SomethingDelegate) <SomethingDelegate>

 - (BOOL)somethingShouldMakePancakes:(Something *)something;    

@end

#endif

这比使用中间的宏在多行中拆分声明要好得多,并且将所有相关方法保存在一个ifdef下的一个地方。