【问题标题】:UI_USER_INTERFACE_IDIOM() crashes app distributed on devices ONLYUI_USER_INTERFACE_IDIOM() 使仅分布在设备上的应用程序崩溃
【发布时间】:2023-03-29 04:27:01
【问题描述】:

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

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/网络链接安装在所有设备上。

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

有什么想法吗?

【问题讨论】:

    标签: ios swift crash


    【解决方案1】:

    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
    

    希望这会有所帮助。

    【讨论】:

    • 同意,我们应该使用 UIDevice var/property。但是,只是对您的答案进行了一些技术性更正 - 它不是宏,而是 UIDevice.h 中定义的“静态内联”函数,并且在类的 swift 版本中有 func 声明。
    • 我欠你一个理智:今天我第一次在发布中编译,而不是调试,我的应用程序崩溃得如此严重......当我在网上寻找答案时,我找到了@987654321 @。 Xcode 7 beta 2 中已修复的事实对我没有帮助,因为我想在下个月发布......所以,我知道 cmets 不是为了感谢,但你拯救了我的一天!
    • 啊,不客气,兄弟。而你让我今天有了一个好的开始。
    【解决方案2】:

    我明白了(部分!)。实际上,swift 项目中 UI_USER_INTERFACE_IDIOM() 的“release”实现会使应用程序崩溃。

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

    但是,我仍然不知道为什么我们的应用商店应用(基于目标 c 语言)不会崩溃。

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

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

    【讨论】:

      【解决方案3】:

      Swift 5.3 及更高版本:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-17
        • 2017-10-13
        • 1970-01-01
        • 1970-01-01
        • 2011-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多