简体   繁体   English

SwiftUI:将 UserDefault Slider 值(双)转换为字符串中的 Int?

[英]SwiftUI: Converting UserDefault Slider Value (Double) to an Int within a String?

I'm having trouble with passing in the value of my slider into a string as Int when using User Defaults.使用用户默认值时,我无法将 slider 的值作为 Int 传递给字符串。 Does anybody have a solution for converting my UserDefault value into my string?有人有将我的 UserDefault 值转换为我的字符串的解决方案吗?

The following works just fine with a basic variable ( Preview ):以下适用于基本变量( Preview ):

    @State var Limit: Double = 8

var body: some View {
    Form {

        // Notification Limit
        Section (header: Text("NOTIFICATION LIMIT")) {
            HStack {
                Slider(value: $Limit, in: 1...15, step: 1.0)
                Text("\(Int(Limit))")
            }
        }

However, when I bring UserDefault Values into play, I recieve the following error: Initializer 'init(:)' requires that 'Binding< Double >' conform to 'BinaryInteger'但是,当我使用 UserDefault Values 时,我收到以下错误: Initializer 'init(:)' requires that 'Binding< Double >' conform to 'BinaryInteger'

    @ObservedObject var settings = notificationSettings()

var body: some View {
    Form {

        // Notification Limit
        Section (header: Text("NOTIFICATION LIMIT")) {
            HStack {
                Slider(value: $settings.globalLimit, in: 1...15, step: 1.0)
                Text("\(Int($settings.globalLimit))")
            }
        }

Leaving '$settings.globalLimit' as just double in the Text String gives the following error: Instance method 'appendInterpolation' requires that 'Binding< Double >' conform to 'FormatSpecifiable'在文本字符串中将 '$settings.globalLimit' 保留为 double 会产生以下错误:实例方法 'appendInterpolation' 要求 'Binding< Double >' 符合 'FormatSpecifiable'

Here's my full code currently for my 'globalSettingsView':这是我目前的“globalSettingsView”的完整代码:

struct globalSettings: View {

@ObservedObject var settings = notificationSettings()

var body: some View {
    Form {
        // On/Off Toggle
        Toggle(isOn: $settings.globalOn) {
            Text("Notifications On/Off")
        }

        // Notification Limit
        Section (header: Text("NOTIFICATION LIMIT")) {
            HStack {
                Slider(value: $settings.globalLimit, in: 1...15, step: 1.0)
                Text("\(Int($settings.globalLimit))")
            }
        }

        // Time Range
        Section (header: Text("TIME RANGE")) {
            DatePicker("Start Time", selection: $settings.startTime, displayedComponents: .hourAndMinute)
            DatePicker("End Time", selection: $settings.endTime, displayedComponents: .hourAndMinute)
        }

        // Notification Limit
        Section (header: Text("HELP")) {
            NavigationLink(destination: howToUse()) {
                Text("How To Use")
            }
            NavigationLink(destination: reportFeedback()) {
                Text("Report Feedback")

            }
            Text("Ratings & Review")
            Text("Credits")
        }
    }
    .navigationBarTitle("Settings")

}

And the 'notificationSettings' class that holds the userDefaults:以及保存 userDefaults 的“notificationSettings”class:

class notificationSettings: ObservableObject {

// Variable Declarations
@Published var globalOn: Bool {
    didSet {
        UserDefaults.standard.set(globalOn, forKey: "globalOn")
    }
}
@Published var globalLimit: Double {
    didSet {
        UserDefaults.standard.set(globalLimit, forKey: "globalLimit")
    }
}
@Published var startTime: Date {
    didSet {
        UserDefaults.standard.set(startTime, forKey: "startTime")
    }
}
@Published var endTime: Date {
    didSet {
        UserDefaults.standard.set(endTime, forKey: "endTime")
    }
}

// Intialization
init() {
    self.globalOn = UserDefaults.standard.object(forKey: "globalOn") as? Bool ?? true
    self.globalLimit = UserDefaults.standard.object(forKey: "globalLimit") as? Double ?? 8.0
    self.startTime = UserDefaults.standard.object(forKey: "startTime") as? Date ?? Date()
    self.endTime = UserDefaults.standard.object(forKey: "endTime") as? Date ?? Date()

}

Any help solving this would be greatly appreciated!任何解决此问题的帮助将不胜感激! Thank you so much!太感谢了!

Just don't use binding ($) in Text , it shows value, not change it只是不要在Text中使用绑定($),它显示价值,而不是改变它

Slider(value: $settings.globalLimit, in: 1...15, step: 1.0)
Text("\(Int(settings.globalLimit))")          // << here !!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM