UI_USER_INTERFACE_IDIM()仅使分布在设备上的应用程序崩溃



我创建了一个基于swift语言的示例单页iOS应用程序,该应用程序在viewDidLoad((-中崩溃

func regularFont() -> UIFont {
    var fontSize : CGFloat = (UI_USER_INTERFACE_IDIOM() == .Pad) ? 15 : 12
    return UIFont.systemFontOfSize(fontSize)
}

但是,一旦我用苹果推荐的UIDevice((方法替换了这个UI_USER_INTERFACE_IDOM((,它就可以正常工作了。

func regularFont() -> UIFont {
    var fontSize : CGFloat = (UIDevice().userInterfaceIdiom == .Pad) ? 15 : 12
    return UIFont.systemFontOfSize(fontSize)
}

崩溃发生在我测试的所有设备上——iPhone 5s、iPhone 6和iPad Air(均在iOS 8.x上(,并且只发生在设备上,而不是模拟器上。

附言:该应用程序通过我们的OTA/web链接安装在所有设备上。

令我惊讶的是,我们在苹果应用商店上有另一个基于c语言的应用程序,它大量使用UI_USER_INTERFACE_IDIM((,并定期更新。。。但从未因此而崩溃。

有什么想法吗?

UI_USER_INTERFACE_IDIOM()只是一个Objective-C宏,定义为:

#define UI_USER_INTERFACE_IDIOM()  ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ?  [[UIDevice currentDevice] userInterfaceIdiom] :  UIUserInterfaceIdiomPhone)

因此,当你使用Swift时,你需要使用as:

UIDevice.currentDevice().userInterfaceIdiom == .Pad
UIDevice.currentDevice().userInterfaceIdiom == .Phone
UIDevice.currentDevice().userInterfaceIdiom == .Unspecified

希望这能有所帮助。

我得到了它(部分!(。实际上,swift项目中UI_USER_INTERFACE_IDIOM()的">release"实现会导致应用程序崩溃。

一旦我将方案编辑为"发布">(Xcode>产品>方案>编辑方案>运行>构建配置更改为"释放"(,然后在模拟器/设备上运行,应用程序就会到处崩溃。。所有设备/模拟器/开发人员/分发配置文件。

然而,我仍然不知道为什么我们的应用商店应用程序(基于目标c语言(没有崩溃。

我唯一的猜测是,这是UI_USER_INTERFACE_IDIOM() API实现中的一个小故障,苹果使用了一些特定于语言的编码(swift与objective c(。

无论如何,我会用UIDevice(). userInterfaceIdiom替换所有的UI_USER_INTERFACE_IDIOM()。我希望这能帮助到别人!

Swift 5.3及以上版本:

if UIDevice.current.userInterfaceIdiom != .pad {
  // do stuff
}

最新更新