如何处理swiftui@State可选打开包装



在swiftui中,我有一个状态变量count,这是可选的,在当前的工作表中,我打开可选的并显示Detailview,但它似乎从未命中。

知道为什么不去那里吗?

它似乎从未击中

DetailView(计数:num(

import SwiftUI
struct ContentView: View {
@State var showDetailView = false
@State var count : Int?
var testArr = [1,2,3,4,5]
var body: some View {

NavigationView {
List(testArr.indices){ indice in
Text("row num (indice)")
.onTapGesture{

self.showDetailView = true
self.count = 5
}

}
.sheet(isPresented: self.$showDetailView) {

if let num = self.count{

//never hit here
DetailView(count: num)
}

}

.navigationBarTitle("Your Reading")
}
}
}

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

struct DetailView: View {

var count: Int

var body: some View {
if count == 5 {
Text("5555")
} else {
EmptyView()
}

}
}

问题不是可选的展开。问题是,在计算尸体时,您正在执行更新计数。要克服这个问题,请使用我的解决方案:swiftui状态变量计数丢失了它存储的

如果该解决方案对您不起作用,请告诉我。

如果您真的必须使用@State var count,则可以使用此解决方法(不推荐(。

DispatchQueue.main.async {
self.count = 5
}

您可以使用sheet(item:content:)而不是sheet(isPresented:content:):

struct ContentView: View {
@State var count: Int?
var testArr = [1, 2, 3, 4, 5]
var body: some View {
NavigationView {
List(testArr.indices) { index in
Text("row num (index)")
.onTapGesture {
self.count = 5
}
}
.sheet(item: $count) { count in
DetailView(count: count)
}
.navigationBarTitle("Your Reading")
}
}
}

请注意,item必须符合Identifiable,因此您需要使用自己的结构或创建Int扩展:

extension Int: Identifiable {
public var id: Int { self }
}

最新更新