视图两次打开时,@ state属性未初始化

时间:2019-08-22 03:29:39

标签: swiftui

  

Xcode 11 beta 6,iOS Develop beta 8

我认为@Satae属性应该初始化,我不知道SwiftUI的错误还是误解了@State。

操作流程是

  1. 点击按钮(显示另一个视图)以打开另一个视图。
  2. 单击文本字段并输入一些数据。
  3. 点击“按钮”或下拉视图以关闭该视图。
  4. 点击按钮(显示另一个视图)以打开另一个视图。
  5. 您会发现文本字段中有数据,它没有初始化。

代码是这样的。

import SwiftUI

struct ContentView: View {
    @State var isShow = false
    var body: some View {
        Button(action: {self.isShow.toggle()}) {
            Text("show another view")
        }.sheet(isPresented: $isShow) {
            AnotherView()
        }
    }
}

struct AnotherView: View {
    @Environment(\.presentationMode) var presentationMode
    @State var text = ""
    var body: some View {
        VStack {
            TextField("Input changing the @State property", text: $text)
            Button(action: {self.presentationMode.wrappedValue.dismiss()}) {
                Text("Dismiss")
            }
        }.padding()
    }
}

演示gif:https://imgur.com/4FWyTOf

1 个答案:

答案 0 :(得分:0)

document.getElementById('tableBody').innerHTML = "<tr><td>"+billSeqId+"<td><a href=" +billImageUrl+" target='_blank'>view</a></td><td>" +billType+"</td><td>" +billStatus+"</td><td class='text-right'><div class='form-group'><select class='form-control' onchange='selectChange()' id='sel1'>" +"<option>Change Status</option><option>Validation Completed</option>" +"<option>Validation Failed</option>" +"</select></div></td></tr>"; 的寿命尽可能长,因此很可能在解构后的视图之间重用。但是人们可以通过几种方式解决它。

由于部分{@State

,仅在首次初始化时重画主体
ObservableObject

由于import SwiftUI struct InitializeStateView: View { @State var isShow = false var body: some View { Button(action: {self.isShow.toggle()}) { Text("show another view") }.sheet(isPresented: $isShow) { InitAnotherView() } } } class InitAnotherViewState: ObservableObject { @Published var wasInitialized = false } struct InitAnotherView: View { init() { print("Init InitAnotherView") } @Environment(\.presentationMode) var presentationMode @ObservedObject var state = InitAnotherViewState() @State var text = "" var body: some View { print("Redrawing InitAnotherView") if !state.wasInitialized { DispatchQueue.main.asyncAfter(deadline: .now()) { self.text = "hey" } state.wasInitialized = true } return VStack { TextField("Input changing the @State property", text: $text) Button(action: {self.presentationMode.wrappedValue.dismiss()}) { Text("Dismiss") } }.padding() } } 而在每个新字符上重画正文

ObservableObject