如果我在我的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上?
谢谢!
答案 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
下的一个地方。