UI_USER_INTERFACE_IDIOM()崩溃了仅在设备上分发的应用程序

时间:2015-07-03 03:26:08

标签: ios swift crash

我在viewDidLoad()中创建了一个基于swift语言的示例单页基于swift语言的应用程序CRASHES -

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

但是一旦我用Apple推荐的UIDevice()方法替换了这个UI_USER_INTERFACE_IDIOM(),它就可以了。

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

崩溃发生在我测试的所有设备上 - iPhone 5s,iPhone 6和iPad Air(全部在iOS 8.x上),它只在仅在设备上发生,而不是模拟器。

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

令我惊讶的是,我们在Apple的App Store上有另一个基于c语言的客观应用程序,该应用程序大量使用UI_USER_INTERFACE_IDIOM(),定期更新......但由于此原因从未崩溃。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

[u'\u4f60\u597d']只是一个Objective-C宏,定义为:

UI_USER_INTERFACE_IDIOM()

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

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

希望这可以提供帮助。

答案 1 :(得分:0)

我得到了它(部分!)。实际上 swift 项目中UI_USER_INTERFACE_IDIOM()的“发布”实施会导致该应用崩溃。

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

然而,我仍然不知道为什么我们的应用程序商店应用程序(基于客观c语言)不会崩溃。

我唯一的猜测是,UI_USER_INTERFACE_IDIOM() API实现中出现了一个小故障,其中包含Apple的一些特定于语言的编码(swift vs objective c)。

无论如何,我会用UI_USER_INTERFACE_IDIOM()替换所有UIDevice(). userInterfaceIdiom。我希望这有助于某人!

答案 2 :(得分:0)

Swift 5.3 及更高版本:

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