按名称访问属性以在较旧的XCode / SDK中工作,`safeAreaInsets`

时间:2018-02-13 09:20:19

标签: ios objective-c xcode

我开始在iOS Objective-C代码中使用UIView.safeAreaInsets,但这仅适用于较新的Xcode / SDK版本。也就是说,在编译时,较旧的SDK将无法识别safeAreaInsets属性。

我想保留与这些旧版本的兼容性。我被告知我能够以某种方式通过名称访问此safeAreaInsets变量,从而避免编译时检查。

怎么做?

我尝试过选择器和valueForKey,但无法让它们正常工作。他们是错误的方法,或者我无法弄清楚语法。

1 个答案:

答案 0 :(得分:0)

以下是保持代码与不同版本兼容的一些方法。我相信还有其他人。

respondsToSelector是运行时检查,以查看对象是否响应某个选择器。也许这就是你要找的东西。不仅可用于区分不同的类版本,还可用于检测可选方法。

if ([self.view respondsToSelector:@selector(safeAreaInsets)]) {
    NSLog(@"safeAreaInsets available");
} else {
    NSLog(@"safeAreaInsets not available");
}

operatingSystemVersion上提供的NSProcessInfo。为操作系统版本提供三个NSInteger

NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];
NSLog(@"Version %d.%d.%d", (int)version.majorVersion, (int)version.minorVersion, (int)version.patchVersion);

@available关键字(或者是宏或指令?)编译为运行代码的OS版本的运行时检查。从Xcode 9.0开始,此方法可用。

if (@available(iOS 11.0, *)) {
    NSLog(@"iOS 11.0 or higher");
} else {
    NSLog(@"below iOS 11.0");
}