如何在swiftui中的视图之间传递数据?

Posted

技术标签:

【中文标题】如何在swiftui中的视图之间传递数据?【英文标题】:How to pass data between views in swiftui? 【发布时间】:2021-01-21 11:05:10 【问题描述】:

我有一个视图,我希望用户在其中输入数据。然后我希望用户能够按下将用户引导到另一个视图的按钮。并且根据用户之前输入的值,我希望更改链接。该链接位于顶层,因为我不止一次需要它。因此,例如,如果用户输入“89”,我希望链接为“https://www.example.com/89”。

这是第一个视图的代码:

class lClass: ObservableObject 
    @Published var longitude: String = ""


struct Data: View 
    @State var showGraph = false
    
    @ObservedObject var longitude2 = lClass()
    
    
    var body: some View 
        Button(action: 
            self.showGraph.toggle()
        ) 
            Text("Show Graph")
        .sheet(isPresented: $showGraph)
            GraphView()
            
        
        
        if showGraph 
            GraphView()
        
        else 
            HStack 
                TextField("Longitude:", text: $longitude2.longitude)
            .frame(width: 400, height: 100, alignment: .center)
        
    

这是第二个视图的缩短代码:

var month = 1
var day = 1
var year = 2020

var latitude = 59.911232

var longitude = 10.757933

var offset = "1.0"

class test 
    @ObservedObject var longitude2 = lClass()


class test2 
   var car = test.init().longitude2




private let url = URL(string: "https://midcdmz.nrel.gov/apps/spa.pl?syear=\(year)&smonth=\(month)&sday=\(day)&eyear=\(year)&emonth=\(month)&eday=\(day)&otype=0&step=60&stepunit=1&hr=12&min=0&sec=0&latitude=\(latitude)&longitude=\(longitude)&timezone=\(offset)&elev=53&press=835&temp=10&dut1=0.0&deltat=64.797&azmrot=180&slope=0&refract=0.5667&field=0")


private func loadData(from url: URL?) -> String 
    guard let url = url else 
        return "nil"
    

    let html = try! String(contentsOf: url, encoding: String.Encoding.utf8)
    
    return html


let html = loadData(from: url)

private func dbl1() -> Double 
    
    let leftSideOfTheValue = "0:00:00,"
    
    let rightSideOfTheValue = "\(month)/\(day)/\(year),1:00:00,"
    
    guard let leftRange = html.range(of: leftSideOfTheValue) else 
        print("cant find left range")
        return 0
    
    
    guard let rightRange = html.range(of: rightSideOfTheValue) else 
        print("cant find right range")
        return 0
    
    
    let rangeOfTheValue = leftRange.upperBound..<rightRange.lowerBound
    
    return Double(html[rangeOfTheValue].dropLast()) ?? 90


struct elevationGraph: View 

    var body: some View 
        Text(String(dbl1())
    
    

最后,我希望用户能够在第一个视图中选择变量、月、日、年、经度、纬度、偏移量。然后操作 url 使其使用用户输入的数据。

【问题讨论】:

【参考方案1】:

所以问题是我如何在应用程序的视图中更新和共享信息。

做到这一点的一种方法是使用一个或多个在视图更新时不会被破坏的常见对象。为此,代码要么需要在View 结构之外创建对象。或者在实例化对象的View 中使用@StateObject

创建后,实例可以作为@ObservedObject 参数的参数传递给子视图。或者如果在app中多处、多关卡使用,可以通过@EnvironmentObject放置到环境中提取,避免“道具钻”

这两个 *** 链接应该有助于澄清:

@ObservedObject vs @StateObject @EnvironmentObject

祝你好运。

【讨论】:

以上是关于如何在swiftui中的视图之间传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从子视图传递到父视图到 SwiftUI 中的另一个子视图?

如何跟踪和保存传递到我的视图 SwiftUI 中的数据

如何将数据从父模型类传递到 SwiftUI 中的子视图

在 SwiftUi 中的视图之间传递列表

将数据从模型传递到 SwiftUI 中的视图

如何在 SwiftUI 中将数据从视图传递到另一个视图?