iOS类可用性的条件代码

时间:2016-07-01 08:28:58

标签: ios objective-c

我正在尝试添加条件代码以防止"未找到符号"使用iOS 8类时iOS 7设备上的错误,在这种情况下为UIBlurEffect

dyld: Symbol not found: _OBJC_CLASS_$_UIBlurEffect

即使条件中的代码没有运行(我没有看到" UIBlurEffect将被使用!" log语句),我仍然得到错误。如果我评论该块,它运行正常。

BOOL blurAvailable = NSClassFromString(@"UIBlurEffect") ? YES : NO;
if (blurAvailable)
  NSLog(@"UIBlurEffect available");
else
  NSLog(@"UIBlurEffect not available");

if (navBarBlurBool && blurAvailable)
{
  NSLog(@"UIBlurEffect will be used!");
    if (![viewController.navigationController.navigationBar viewWithTag:BLUR_NAVBAR_TAG])
    {
        // Code works on iOS 7 if this block is commented out:

        [self storeOriginalNavBarImages];

        [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
        self.navigationController.navigationBar.shadowImage = [UIImage new];
        UIVisualEffectView *blur = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
        CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
        blur.frame = CGRectMake(0, -1 * statusBarFrame.size.height, self.navigationController.navigationBar.frame.size.width, self.navigationController.navigationBar.frame.size.height + statusBarFrame.size.height);
        blur.userInteractionEnabled = NO;
        blur.tag = BLUR_NAVBAR_TAG;
        [self.navigationController.navigationBar insertSubview:blur atIndex:0];
    }
}

我不明白 - 我会假设如果blurAvailable为假,则违规代码不应该运行,我不应该找到"未找到符号"运行时错误。

我使用的是iOS 9.2 SDK。 Xcode 7.2。部署目标是iOS 7.0。

2 个答案:

答案 0 :(得分:0)

请确保iOS 7上的blurAvailable确实是NO

也许这个类在iOS 7上可用,但在文档中没有标记。他们可能已经将它作为私有类在iOS 7中引入(只是将其隐藏在doc和header中)。

尝试测试标记为&#34的另一个类;在iOS 7和#34;比如UIVisualEffectView

答案 1 :(得分:0)

根据this question中的评论,答案是在“构建阶段”中添加UIKit作为可选依赖关系 - > “将Binary与Libraries联系起来”。我现在可以在iOS 7设备上运行条件iOS 8代码而不会出错。