Define the “Temperature Block” setting of the user on iOS 10 (Celsius / Fahrenheit)

iOS 10 adds the ability for the user to set their own "Temperature Unit" in the "Settings"> "General"> "Language and Region"> "Temperature Unit".

How can my application programmatically determine this parameter so that it can display the correct temperature block? I poured NSLocale.h and did not see anything suitable.

(Before iOS 10, it was enough to check if the locale uses the metric and suggest that metric users want to use Celsius. This is no longer the case.)

+9
source share
5

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

NSLocaleTemperatureUnit NSLocaleKey:

FOUNDATION_EXPORT NSLocaleKey const NSLocaleTemperatureUnit;

:

temperatureUnit = [[NSLocale currentLocale] objectForKey:NSLocaleTemperatureUnit]

Swift (2.3):

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

, "Celcius", "Fahrenheit".

: iOS 10. iOS 9 , "dyld: Symbol not found: _NSLocaleTemperatureUnit" .

NSLocaleTemperatureUnit. :

FOUNDATION_EXPORT NSLocaleKey const NSLocaleTemperatureUnit  __attribute__((weak_import));

dyld. NSLocaleTemperatureUnit, .

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

EDIT:

, Apple , Testflight. , . .

+5

(NS)MeasurementFormatter. (NS)Formatter. , IOS 10+ SDK.

, , .

a Measurement Swift 3:

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

, . , .

:

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

Swift:

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

Objective-C:

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


.

+13

, , , , @fábio-oliveira .

Apple: https://forums.developer.apple.com/thread/70258

, , , ( JSON ) , , "" > "" > " " > " ". , 0 .

, Swift 4 ( - ):

func temperatureFormatter(kelvinTemp: Double) -> String{
        let mf = MeasurementFormatter()
        mf.numberFormatter.maximumFractionDigits = 0
        let t = Measurement(value: kelvinTemp, unit: UnitTemperature.kelvin)
        return (String(format:"%@", mf.string(from: t)))
    }

(_currentTemp - JSON, convertTemp - , ):

convertedTemp = temperatureFormatter(kelvinTemp: _currentTemp)

, , . !

+1

UnitTemperature, , . , , -, .

extension UnitTemperature {
  static var current: UnitTemperature {
    let measureFormatter = MeasurementFormatter()
    let measurement = Measurement(value: 0, unit: UnitTemperature.celsius)
    let output = measureFormatter.string(from: measurement)
    return output == "0°C" ? .celsius : .fahrenheit
  }
}

, , .

+1

- , Apple : https://forums.developer.apple.com/thread/70258.

, . MeasurementFormatter , MeasurementFormatter .

0

Source: https://habr.com/ru/post/1655974/


All Articles