SwiftUI:Toggle详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SwiftUI:Toggle详解相关的知识,希望对你有一定的参考价值。

参考技术A 使用:

ToggleStyle,可以根据该模板定制

条件判断是否能点击Toggle

由于SwiftUI的Gesture事件是先由子控件触发,所以可以使用simultaneousGesture ()修饰符告诉SwiftUI您希望父手势和子手势同时触发,如:

SwiftUI:如何将 .toggle() not Toggle(isOn..) 与 UserDefault 结合使用

【中文标题】SwiftUI:如何将 .toggle() not Toggle(isOn..) 与 UserDefault 结合使用【英文标题】:SwiftUI: How to combine .toggle() not Toggle(isOn..) with UserDefault 【发布时间】:2020-08-11 20:41:19 【问题描述】:

目前我有

@Published var isVisited: Bool 
        didSet
            UserDefaults.standard.set(isVisited,forKey: "isVisited")
        
    
    init() 
        self.isVisited = UserDefaults.standard.object(forKey: "isVisited") as? Bool ?? false
    
@State private var edit = false
@ObservedObject var userSettings = UserSettings()

Button(action:  self.edit.toggle()) 
                    if self.edit 
                        Image(systemName: "heart.fill").font(.title)
                     else 
                        Image(systemName: "heart").font(.title)
                    
                .foregroundColor(.red)

理想情况下,只要点击“心”图标,它就会被填充并将数据保存到 UserDefault 数据库。我只知道 Toggle(isOn:..) 的用途。

任何建议将不胜感激!

【问题讨论】:

【参考方案1】:

你的意思是这样的吗?

class UserSettings: ObservableObject 
    init() 
        isVisited = UserDefaults.standard.bool(forKey: "isVisited")
    

    @Published var isVisited: Bool 
        didSet 
            UserDefaults.standard.set(isVisited, forKey: "isVisited")
        
    


struct RootView: View 
    @ObservedObject var userSettings = UserSettings()

    var body: some View 
        Button(action:  self.userSettings.isVisited.toggle() ) 
            if self.userSettings.isVisited 
                Image(systemName: "heart.fill").font(.title)
             else 
                Image(systemName: "heart").font(.title)
            
        .foregroundColor(.red)
    

我在这里所做的是,每次加载 UserSettings 时,我都会从 UserDefaults 加载 isVisited,然后每当设置该属性时,它都会更新 UserDefaults

然后在视图上而不是使用@State 保存数据,我直接从UserSettings 获取数据,因为它将拥有最新的数据。

【讨论】:

哇!!我做了同样的事情,但没有成功,也许我留下了 $ like self.$userSettings.isVisited.toggle() !非常感谢@Daniel Amarante 您可以删除 init 并执行以下操作:@Published var isVisited = UserDefaults.standard.bool(forKey: "isVisited") ... 顺便问一下@Daniel Amarante 和@pawello2222,如果我想将保存的数据显示到另一个视图,那么该怎么做呢?我真的不想只为这个人使用 CoreData @DucDang 这是另一个问题 :) 请创建一个新帖子并在那里描述您的问题。 @DucDang 您可以将UserSettings 的同一个实例共享为环境对象,然后对它的所有更改都会在所有屏幕上发生。

以上是关于SwiftUI:Toggle详解的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中的 Toggle() 运算符可以实现整数吗

UserDefaults 在 SwiftUI 中与 Toggle 绑定

有没有办法使用 SwiftUI 将选项绑定到 Toggle / Slider

切换 swiftUI toggle() 时如何触发操作?

SwiftUI Toggle 更改值时运行代码

SwiftUI 4.0为Toggle视图在iOS 16中增加属性多选功能