微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI:将UserDefault滑块值Double转换为字符串中的Int?

如何解决SwiftUI:将UserDefault滑块值Double转换为字符串中的Int?

使用“用户认值”时,我无法将滑块的值作为Int传递给字符串。 有人可以将UserDefault值转换为我的字符串吗?

以下对于基本变量(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))")
            }
        }

但是,当我使用UserDefault Values时,我收到以下错误 初始化器'init(:)'要求'Binding '必须符合'BinaryInteger'

    @Observedobject var settings = notificationSettings()

var body: some View {
    Form {

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

在文本字符串中仅将'$ settings.globalLimit'保留为两倍会产生以下错误 实例方法'appendInterpolation'要求'Binding '必须符合'FormatSpecifiable'

这是当前用于“ 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,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")

}

还有保存userDefaults的'notificationSettings'类:

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()

}

任何帮助解决此问题的方法将不胜感激!非常感谢!

解决方法

请不要在Text中使用绑定($),它会显示值,而不是更改值

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。