在下面的代碼中,我有一個可選的@State變數呼叫isReseting,我true通過點擊一個按鈕來設定它。該按鈕也觸發時,它的拍了拍片,這是作業的罰款,但什么行不通的是,如果我讀的價值isResting里面的變數.sheet它輸出作為nil和我期待這是true因為它被設定為true當按鈕被點擊。
任何想法,為什么值isReseting變數變成nil里面的.sheet?
struct Item: Identifiable{
var id = UUID()
var name:String
var active:Bool
}
struct ContentView: View {
var items:[Item] = [Item(name: "Oranges", active: true),
Item(name: "Apples", active: false),
Item(name: "Cookies", active: false) ]
@State private var selectedItem: Item?
@State private var isReseting: Bool?
var body: some View {
List{
ForEach(items){ item in
HStack{
Text(item.name)
Button(item.active ? "Reset": "Initiate"){
selectedItem = item
isReseting = true
let _ = print("Value after button tap: \(isReseting)")// output: Value after button tap: Optional(true)
}
.padding()
.background(item.active ? Color.blue: Color.gray)
.foregroundColor(.white)
.cornerRadius(30)
.frame(width: 100, height: 65)
}
}
}
.sheet(item: $selectedItem){ item in
// I'm expecting isReseting to be true here, but it's nil
let _ = print("Value in sheet: \(isReseting)")// outputs: Value in sheet: nil
if isReseting == true {
Text("It's reseting!!!")
}else{
Text("It's NOT reseting")
}
}
}
}
uj5u.com熱心網友回復:
我認為您會被這樣一個事實所吸引,即sheet(item:) 僅基于item- 而不是封裝視圖的@State變數重新渲染。只要您明確isReseting通過item,它就會起作用:
struct Item: Identifiable, Equatable {
var id = UUID()
var name:String
var active:Bool
}
struct ContentView: View {
var items:[Item] = [Item(name: "Oranges", active: true),
Item(name: "Apples", active: false),
Item(name: "Cookies", active: false) ]
struct SheetItem : Identifiable {
var item: Item
var isReseting: Bool
var id: UUID {
self.item.id
}
}
@State private var selectedItem: SheetItem?
@State private var isReseting: Bool?
var body: some View {
List{
ForEach(items){ item in
HStack{
Text(item.name)
Button(item.active ? "Reset": "Initiate"){
isReseting = true
selectedItem = SheetItem(item: item, isReseting: isReseting ?? false)
}
.padding()
.background(item.active ? Color.blue: Color.gray)
.foregroundColor(.white)
.cornerRadius(30)
.frame(width: 100, height: 65)
}
}
}
.sheet(item: $selectedItem) { item in
let _ = print("Value in sheet: \(item.isReseting)")
if item.isReseting == true {
Text("It's reseting!!!")
} else {
Text("It's NOT reseting")
}
}
}
}
實作此目的的第二種方法是顯式傳遞 a Binding(即使您不需要在作業表中對其進行變異),因為它將保持與@State變數的鏈接:
struct Item: Identifiable{
var id = UUID()
var name:String
var active:Bool
}
struct ContentView: View {
var items:[Item] = [Item(name: "Oranges", active: true),
Item(name: "Apples", active: false),
Item(name: "Cookies", active: false) ]
@State private var selectedItem: Item?
@State private var isReseting: Bool?
var body: some View {
List{
ForEach(items){ item in
HStack{
Text(item.name)
Button(item.active ? "Reset": "Initiate"){
selectedItem = item
isReseting = true
let _ = print("Value after button tap: \(isReseting)")// output: Value after button tap: Optional(true)
}
.padding()
.background(item.active ? Color.blue: Color.gray)
.foregroundColor(.white)
.cornerRadius(30)
.frame(width: 100, height: 65)
}
}
}
.sheet(item: $selectedItem){ item in
// I'm expecting isReseting to be true here, but it's nil
SheetView(isReseting: $isReseting)
}
}
}
struct SheetView : View {
@Binding var isReseting : Bool?
var body: some View {
let _ = print("Value in sheet: \(isReseting)")// outputs: Value in sheet: nil
if isReseting == true {
Text("It's reseting!!!")
}else{
Text("It's NOT reseting")
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/347600.html
上一篇:多個Encodable實作
