2

好的,我知道有很多关于此的帖子,但我仍然遇到问题。这是我正在尝试做的伪代码:

if(device is running iOS 5 or up)

    @interface RootViewController : UIViewController <UIPageViewControllerDelegate, UIGestureRecognizerDelegate>

    @property (strong, nonatomic) UIPageViewController *pageViewController;

else

    @interface RootViewController : UIViewController <LeavesViewDelegate, UIGestureRecognizerDelegate>

    @property (strong, nonatomic) LeavesViewController *leavesViewController;

endif

我是否认为我需要使用预处理器宏检查,因为它在头文件中?这是一个图书应用程序,如果它是 iOS 5 或更高版本(因此有 UIPageViewController),它应该使用 UIPageViewController,否则它会退回到 Leaves(https://github.com/brow/leaves)。我已经设置了所有代码。只需要知道如何告诉编译器使用哪个。我不认为使用任何运行时检查会起作用,因为我只需要编译 UIPageViewController 或 Leaves 的协议方法,而不是两者。而且我宁愿不使用完全独立的源文件。我试过使用这些检查:

#ifdef kCFCoreFoundationVersionNumber_xxx

#ifdef __IPHONE_xxx

#if __IPHONE_OS_VERSION_MAX_ALLOWED <__IPHONE_xxx

(有各种 xxx 的)

我在这里想念什么?

编辑:

我还在默认的 .pch 中注意到了这一点:

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

这让我想知道为什么相同的测试在我的 .h 文件中不起作用?

4

2 回答 2

0

你不能这样做,因为预处理器宏是在编译时处理的。编译器应该如何知道你的目标是哪个 iOS,因为你是在你的 Mac 上编译而不是每个人都在他的 iPhone 上编译?

您不能在运行时轻松切换代码。有一些可能性,但我认为这并不是你想要的那样。

您可以在运行时检查特定 SDK 中是否有可用的方法。这更简单明了。但是,您无法实现目标。

我建议:创建一个超类,其中不包含特定的委托协议。在那里你写了你所有的代码,你想分享。

然后从上层超类创建 2 个子类。在每个类中放入您的特定代码。

就是这样。这是应该的方式。

于 2012-04-20T06:55:58.003 回答
0

正如我在评论中提到的,您不能在编译时执行此操作。

但这里有一个想法给你:似乎和的方法名称UIPageViewControllerDelegateLeavesViewDelegate相交,所以你可以在你的头文件中添加以下内容:

-(void) leavesView:(LeavesView*)leavesView willTurnToPageAtIndex:(NSUInteger)pageIndex;
-(void) leavesView:(LeavesView*)leavesView didTurnToPageAtIndex:(NSUInteger)pageIndex;
-(void) pageViewController:(UIPageViewController*)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray*)previousViewControllers transitionCompleted:(BOOL)completed;
-(UIPageViewControllerSpineLocation) pageViewController:(UIPageViewController*)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation;

并且没有在头文件中明确采用委托协议(在 中省略委托< >)。

无论您为这两个使用什么类,都可以在您的 *.m 文件中以如下方式实例化:

// check for existence of class to determine which controller to instantiate
if(NSClassFromString(@"UIPageViewController"))
{
    // do something and set UIPageViewController delegate to "self"
}
else
{
    // do something else and set LeavesViewController delegate to "self"
}

最后,要编译它,您可能需要转发声明所有使用它们LeavesViewControllerUIPageViewController相关类,并可能对某些框架使用弱链接

我还没有使用过 Apple 的UIPageViewController类和协议,所以我无法提供比这更多的见解。如果您敲定了什么,请务必让我们知道 :)

于 2012-04-20T07:19:24.520 回答