2015-07-03 35 views
1

我創建了一個基於iOS的應用程序,在本功能調用崩潰在viewDidLoad中()的樣本單頁迅速語言設備 -UI_USER_INTERFACE_IDIOM()崩潰的應用程序分佈在ONLY

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

但是,一旦我更換此UI_USER_INTERFACE_IDIOM()與蘋果推薦使用UIDevice()方法,它工作正常。

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

所述的碰撞發生在我測試的所有設備 - iPhone 5S,iPhone 6和ipad空氣(所有iOS上8.x中)和它發生ONLY上的設備,NOT模擬器。

PS:該應用程序通過我們的OTA /網頁鏈接安裝在所有設備上。

令我驚訝的是,我們有另一個客觀的基於C語言的應用程序在蘋果的App Store上使用UI_USER_INTERFACE_IDIOM()大量定期更新......但從來沒有因此崩潰。

有什麼想法?

回答

0

我明白了(部分!)。其實「版本」執行UI_USER_INTERFACE_IDIOM()swift項目崩潰的應用程序。

一旦我編輯計劃,以「釋放」(的Xcode>產品>方案>編輯方案>運行>構建配置更改爲「發行」),然後模擬器/設備上運行的應用程序崩潰無處不在..所有設備/模擬器/開發者/分發配置文件。

但是,我仍然不知道爲什麼我們的應用商店應用(基於目標c語言)不會崩潰。

我唯一的猜測是,這是UI_USER_INTERFACE_IDIOM() API實現中的一個小故障,其中包含Apple的一些語言特定編碼(swift vs objective c)。

無論如何,我會用UIDevice(). userInterfaceIdiom替換全部UI_USER_INTERFACE_IDIOM()。我希望這可以幫助別人!

5

UI_USER_INTERFACE_IDIOM()只是一個Objective-C宏,它被定義爲:

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

所以,當你用斯威夫特工作,你需要爲使用:

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

希望這可以幫助。

+1

同意,我們應該使用UIDevice var/property。但是,對你的答案只是一點技術性的修正 - 它不是一個宏,而是UIDevice.h中定義的「靜態內聯」函數,並且在類的快速版本中有func聲明。 – Ashok

+0

我欠你的理智:今天我第一次編譯發佈,而不是調試,我的應用程序崩潰得這麼辛苦......當我在網上尋找答案時,發現[this](http:// openradar .appspot.com的/ 21175489)。 Xcode 7 beta 2中修復的事實並不能幫助我,因爲我想在下個月推出......所以,我知道評論並不是爲了感謝,而是你保存了我的一天! – cdf1982

+0

啊,不客氣,兄弟。你讓我今天有了一個好的開始。 –