【问题标题】:How to pass data between views in swiftui?如何在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 使其使用用户输入的数据。

【问题讨论】:

    标签: swift view swiftui


    【解决方案1】:

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

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

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

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

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 2015-12-23
      • 2014-06-18
      相关资源
      最近更新 更多