[英]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.