variables - SwiftUI 在 Struct 之间共享变量

标签 variables swiftui

import SwiftUI


struct ReserveView: View {
    @State var searchT = ""
    @State var isSearching = false
    @State private var showCheckAlert = false
    @Binding var roomnum:Int

    
    @StateObject private var vm = ReserveViewModel(
        service: ReserveService()
    
    )
    var body: some View {
        
        VStack{
                HStack{
                    TextField("Search", text:$searchT)
                        .padding(.leading, 30)
                    
                }
                .padding()
                .background(Color.gray.opacity(0.2))
                .cornerRadius(6)
                .padding(.horizontal)
                .onTapGesture(perform: {
                    isSearching = true
                })
                .overlay(
                   HStack {
                       Image(systemName: "magnifyingglass")
                       Spacer()
                       
                   }.padding(.horizontal,32)
                    .foregroundColor(.white)
                )
                if isSearching {
                    Button(action:{
                        isSearching = false
                        searchT = ""
                        
                        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for:nil)
                        
                    }, label: {
                        Text("Cancle")
                            .padding(.trailing)
                            .padding(.leading,0)
                    })
                    .transition(.move(edge: .trailing))
                }
                switch vm.state{
                case .success(let data):
                    List{
                        ForEach((data).filter({"\($0)".contains(searchT)||searchT.isEmpty}),
                                id: \.roomnum){ item in
                                    HStack{
                                        Text("\(item.when) \(item.time) \(item.username)").foregroundColor(Color.black)
                                            
                                        
                                    }
                            
                        }
                   
                    }
                    .padding(.bottom,15)
                        
                    
                    //.padding(.top,20)
                    
                case .loading:
                    ProgressView()
                default:
                    EmptyView()
                }
            }
            .task {
                await vm.getReserves()
            }
            
       
            
    }
    
}



struct ReserveView_Previews: PreviewProvider {
    static var previews: some View {
        ReserveView(roomnum:.constant(""))
    }
}
import Foundation
import SwiftUI

struct ReserveService {
   
    enum ReserveListError: Error {
        case failed
        case failedToDecode
        case invalidStatusCode
    }
    
    func fetchReserves() async throws -> [Reserve] {
       
        
        
        let url = URL(string: "https://f6d3-119-203-102/roomreserveview?roomnum=\(here i want use variable)")!
        let configuration = URLSessionConfiguration.ephemeral
        print(url)
        let (data, response) = try await URLSession(configuration: configuration).data(from: url)
        guard let response = response as? HTTPURLResponse,
              response.statusCode == 200 else{
            throw ReserveListError.invalidStatusCode
        }
       
        let decodedData = try JSONDecoder().decode(ReserveServiceResult.self, from: data)
        return decodedData.reserveInfo
        
        

    }
}

import SwiftUI

import Foundation

@MainActor
class ReserveViewModel: ObservableObject {
    
    enum State {
        case na
        case loading
        case success(data: [Reserve])
        case failed(error: Error)
    }
    
    @Published private(set) var state: State = .na
    @Published var hasError: Bool = false
    
    private let service: ReserveService
    
    init(service: ReserveService) {
        self.service = service
    }
    func getReserves() async {
        self.state = .loading
        self.hasError = false
        
        do {
            let reserves = try await service.fetchReserves()
            self.state = .success(data: reserves)
            
        }catch {
            self.state = .failed(error: error)
            self.hasError = true
            print(String(describing: error))
            
           
            
        }
    }
}

您好!我想问你一个 SwiftUI 问题。

基于 ReserveService 文件,我正在实现在 ReserveView 中列出和显示所需数据的部分。

我想通过从 ReserveView 模型接收变量“roomnum”到 ReserveService 来完成“fetchReserves”函数中的 url。 但是,Binding 似乎不起作用,因为 ReserveService 不是 View 模型。有什么办法可以从 View 模型中获取这个变量吗? 如果你不明白我的解释,请再提问。

这是我第一次提问。问题如有遗漏请见谅

最佳答案

可以将它作为函数参数注入(inject),比如

func fetchReserves(_ roomnum: Int) async throws -> [Reserve] {
   
    let url = URL(string: 
      "https://f6d3-119-203-102/roomreserveview?roomnum=\(roomnum)")!

关于variables - SwiftUI 在 Struct 之间共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73189779/

相关文章:

javascript - 如何将变量传递给 'window.open' ?

c - 在开始使用方法进行 C 编程时

swift - 如何从 Coordinator 类更新 EnvironmentObject 变量?

SwiftUI:隐藏键盘但显示光标

SwiftUI 列表选择始终为零

javascript - 当变量名称等于字符串时如何调用变量?

java - Eclipse 中的环境变量

perl - 使用 Perl 将用户名作为 SSH 中的变量

ios - 从 SwiftUI 上的部分列表中删除项目

swift - 如何使用 SwiftUI 让按钮和标签共享相同的宽度?