xcode 使用2个按钮更改所有切换状态(开/关)

qqrboqgw  于 2023-02-25  发布在  其他
关注(0)|答案(1)|浏览(196)

我是WatchOS世界的新手,正因为如此,我需要一些帮助来度过一个阶段,即使有教程,我似乎也无法做我需要做的事情。
我有一个简单的watchOS应用程序。基本上它是一个列表切换2按钮。我想要做的是,当点击所说的按钮,有所有的切换更改为“关闭”状态。同样,其他按钮将把他们所有的**“打开”状态**。
下面是我目前为止的代码(一些代码被删除):

import SwiftUI

struct User: Decodable {
    var theID: String
    var name: String
    var description: String
    var isOn: Bool
}

var body: some View {
    List{
        ForEach($users, id: \.theID) { $item in
            HStack {
                Toggle(isOn: $item.isOn) {
                    Label {
                        Text(item.description)
                            .frame(maxWidth: 85)
                            .frame(maxHeight: 100)
                            .frame(maxWidth: .infinity, alignment: .trailing)
                    } icon: {
                        if item.name == "J" {
                            Image("imgJayden")
                                .scaledToFill()
                            
                        } else if item.name == "T" {
                            Image("imgTab")
                                .scaledToFill()
                        } else {
                            Image("imgBoth")
                                .scaledToFill()
                        }
                    }
                    .onChange(of: item.isOn) { value in
                        if (rndCnt == 0) {
                            if (value) {
                                //print("tunning on")
                                sendJsonData(a: item.theID, b: item.name, c: item.description, d: item.isOn)
                            } else {
                                //print("turning off")
                                sendJsonData(a: item.theID, b: item.name, c: item.description, d: item.isOn)
                            }
                            
                            rndCnt = 1
                        } else {
                            rndCnt = 0
                        }
                    }
                }
            }.padding(2)
        }
        List{
            HStack (alignment: .center, spacing: 50){
                Button {
                    }label: {
                        Image("on")
                            .scaledToFill()
                            .frame(maxWidth: .infinity, alignment: .center)
                    }
                    .onTapGesture {
                        print("turned all on!")
                    }
                Button {
                    }label: {
                        Image("off")
                            .scaledToFill()
                            .frame(maxWidth: .infinity, alignment: .center)
                    }
                    .onTapGesture {
                        print("turned all off!")
                    }
            }
        }
    }
    .onAppear(perform: loadData)
}
    
    func loadData() {
        guard let url = URL(string: "http://192.168.1.1:81/data.php?data=ALL") else {
            print("Invalid URL")
            
            return
        }
        
        let request = URLRequest(url: url)
        
        URLSession.shared.dataTask(with: request) {data, response, error in
            if let data = data {
                let decoder = JSONDecoder()
                
                decoder.dateDecodingStrategy = .iso8601
                
                if let decodedResponse = try?
                    decoder.decode([User].self, from: data) {
                    DispatchQueue.main.async {
                        self.users = decodedResponse
                    }
                    
                    return
                }
            }
            
            print("Fetch failed: \(error?.localizedDescription ?? "Unknown error....")")
        }.resume()
    }

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

对于我的列表,我有.onAppear(perform: loadData),它用数据填充开关(在函数loadData中)。现在我在如何循环通过所有开关并根据按下的按钮将它们全部设置为onoff**上停滞不前。
如果有人能帮我解决这个问题就太好了!

ldioqlga

ldioqlga1#

删除ButtononTapGesture,它们不需要它,它们是按钮。使用此示例代码打开/关闭所有用户Toggle

List{
     HStack (alignment: .center, spacing: 50){
         Button {
             print("turned all on!")
             users.indices.forEach { users[$0].isOn = true } // <-- here
             // alternative
             // for i in users.indices { users[i].isOn = true }
         }label: {
             Image("on")
                 .scaledToFill()
                 .frame(maxWidth: .infinity, alignment: .center)
         }
         Button {
             print("turned all off!")
             users.indices.forEach { users[$0].isOn = false }  // <-- here
         }label: {
             Image("off")
                 .scaledToFill()
                 .frame(maxWidth: .infinity, alignment: .center)
         }
     }.buttonStyle(.bordered)  // <-- here
 }

相关问题