我创建了一个基于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
}