2016-09-27 21 views
4

iOS 10では、設定>一般>言語&地域>温度単位で、ユーザーが「温度単位」を選択できるようになりました。iOS 10(摂氏/華氏)のユーザーの「温度単位」の設定

私のアプリは、この設定をプログラムで決定して正しい温度単位を表示する方法を教えてください。私はNSLocale.hを流し込み、関連するものは見当たりませんでした。

(iOSの10の前に、ロケールがメトリックを使用かどうかをテストするのに十分ではなかったとメトリックユーザーが摂氏を使用することを前提としています。これはもはやケースです。)

+0

この設定を使用する場所から始めましょう。私は温度次元をフォーマットするためにNSDimensionFormatterクラスで遊んできましたが、Settingsアプリケーションから "Temperature Unit"設定を尊重しているようには見えません。この設定に基づいて表示を変更するものは見つかりましたか? – rmaddy

答えて

2

http://blog.timac.org/?tag=nslocaletemperatureunit

まず、NSLocaleTemperatureUnit NSLocaleKey公開:

temperatureUnit = [[NSLocale currentLocale] objectForKey:NSLocaleTemperatureUnit] 

またはスウィフト:

FOUNDATION_EXPORT NSLocaleKey const NSLocaleTemperatureUnit; 

が続いてこれでユニットをチェックします(2.3):

if let temperatureUnit = NSLocale.currentLocale().objectForKey(NSLocaleTemperatureUnit) { 
    ... 
} 

"Celcius"または "Fahrenheit"のいずれかの文字列を返します。

しかし、10より前のバージョンのiOSと下位互換性がないという問題があります。iOS 9以前のデバイスでアプリを実行すると、「dyld:Symbol not found:_NSLocaleTemperatureUnit」というエラーが表示されますアプリの起動。

解決策は、NSLocaleTemperatureUnit変数定義に弱いリンクを使用することです。このように:

FOUNDATION_EXPORT NSLocaleKey const NSLocaleTemperatureUnit __attribute__((weak_import)); 

これは、アプリがdyldのチェックを通過させます。しかし、NSLocaleTemperatureUnitを使用する前にOSのバージョンを確認する必要があります。そうしないと、アプリケーションがクラッシュして例外が発生します。

if #available(iOS 10,*) { 
    if let temperatureUnit = NSLocale.currentLocale().objectForKey(NSLocaleTemperatureUnit) { 
     ... 
    } 
} 

EDIT:

私は私のアプリでそれを試してみましたが、私はTestflightにアップロードしたときに、アップルはそれのためのアプリを拒否しました。だから彼らは間違いなく私たちが独自のフォーマッタクラスに設定を使用することを望んでいません。私はかなり迷惑なことがわかります。

+0

で説明しています。@ pedroanアプローチを使用したこの(およびiOS 10.2での私のテスト)によれば、デバイスでテストするとうまくいきます。 https://forums.developer.apple.com/thread/70258 –

7

(NS)MeasurementFormatterクラスがあります。それは(NS)Formatterクラスから継承します。 iOS 10+ SDKの新しいクラスです。

私が知る必要があるかどうか、ユーザーが自分の設定でどのような単位を設定したかはわかりません。

let formatter = MeasurementFormatter() 
let measurement = Measurement(value: 24.5, unit: UnitTemperature.celsius) 
let temperature = formatter.string(from: measurement) 
print(temperature) // 76.1°F 
// this value was computed to Fahrenheit value on my locale/preferences 

Measurementの検索の場合:

print(measurement.unit) // °C - always celsius as it was set as Celsius 

formatter.unitStyle = .long 

formatter.locale = Locale.current 
formatter.string(from: measurement.unit) // degrees Celsius - always an original unit 
formatter.string(from: measurement) // 76.1 degrees Fahrenheit - regarding locale/settings 

formatter.locale = Locale.init(identifier: "it_IT") 
formatter.string(from: measurement.unit) // gradi Celsius - always an original unit 
formatter.string(from: measurement) // 24,5 gradi Celsius - regarding locale/settings 

システムが知っている、どのような単位我々が設定した

スウィフト3を使用してMeasurementを設定します。この値は、値ののペアと測定単位に設定されているため、すべての値の変換作業を処理します。

measurement.converted(to: UnitTemperature.kelvin).value // 297.65 

スウィフト:

手動変換について

https://developer.apple.com/reference/foundation/measurementformatter

のObjective-C:

https://developer.apple.com/reference/foundation/nsmeasurementformatter?language=objc


自由に文法を修正してください。私が見つけたアレクサンドル・コルッチことで、この記事ではあり

+1

しかし、この質問にはお答えできません。 'MeasurementFormatter'は、iOS 10の「Temperature Unit」設定に基づいて出力を変更しません。同じものではないロケールに基づいてフォーマットします。 – rmaddy

+0

はい、そうではありません。しかし、堅実な研究の後、私は、任意のAPIによってこの情報を取得する方法がないと考えていますが、理由はそれが必要ではないということです。 – pedrouan

+0

なぜそれは必要ではないと言いますか? 'MeasurementFormatter'がSettingsアプリケーションの新しい" Temperature Unit "設定を尊重しない場合、ユーザが行った設定を尊重するために、他の方法が見つかるはずです。 – rmaddy

関連する問題