SwiftUI @State 및 .sheet () ios13 대 ios14
안녕하세요 저는 여기서 문제가 발생하고 ios13 또는 ios14에서 실행할 때 내 .sheet ()보기간에 일관된 동작이 없습니다.
나는 다음과 같은 견해를 얻었다.
@State private var label: String = ""
@State private var sheetDisplayed = false
///Some code
var body: some View {
VStack {
Button(action: {
self.label = "A label"
self.isDisplayed = true
}) {
Text("test")
}
}.sheet(isPresented: $sheetDisplayed, onDismiss: {
self.label = ""
}) {
Text(self.label)
}
}
iOS 13에서는 예상대로 작동합니다. btn 클릭-> 레이블 설정-> 콜 시트-> 텍스트보기에 "A 레이블"표시.
ios14에서는 시트를 닫을 때 self.label에 빈 문자열이 있으므로 아무것도 표시하지 않습니다.
내가 뭔가를 놓쳤나요? iOS 14 버그입니까, 아니면 ios13에서 잘못 되었습니까?
추신 : 클로저에서 전달되는 몇 가지 다른 변수가 있습니다.
답변
코드에 뷰 업데이트 / 생성 순서가 예상되지만 일반적으로 정의되지 않았습니다 (iOS 14에서 변경되었을 수 있음).
시트 내부에 정보를 전달하는 명시적인 방법이 있습니다. 즉, 다른 시트 작성자를 사용합니다. .sheet(item:...
다음은 신뢰할 수있는 예입니다. Xcode 12 / iOS 14로 테스트 됨
struct ContentView: View {
@State private var item: Item?
struct Item: Identifiable {
let id = UUID()
var label: String = ""
}
var body: some View {
VStack {
Button(action: {
self.item = Item(label: "A label")
}) {
Text("test")
}
}.sheet(item: $item, onDismiss: { self.item = nil }) { Text($0.label)
}
}
}
이것은 문서화되지 않은 것으로 보이는 iOS 14의 정말 이상한 동작입니다.
은 Using 다른 대답 여기에 의견 이 스레드를 , 내가 사용하는 @Binding것이 가장 깨끗하고 가장 SwiftUI - 변호사 솔루션을 보였다으로이 문제를 해결하기 위해.
이 동작이 왜 바뀌 었는지 모르겠고, 이전보다 덜 직관적 인 것처럼 보이므로 버그라고 가정합니다!
예 :
struct MainView: View {
@State private var message = ""
@State private var showSheet = false
var body: some View {
Button(action: {
self.message = "This will display the correct message"
self.showSheet = true
}, label: {
Text("Test Button")
})
.sheet(isPresented: self.$showSheet) { SheetView(message: self.$message)
}
}
}
struct SheetView: View {
@Binding var message: Int
var body: some View {
Text(self.message)
}
}
SwiftUI 2.0에서 동작이 변경 되었기 때문에 MacOS 11에도 영향을 미칩니다. 뷰에 바인딩을 추가하면 해당 바인딩이 사용되지 않는 경우에도 문제가 해결되어 이것이 구현 버그라고 생각합니다. 또한 뷰 본문 내의 Text ()에서 details 상태 변수를 사용하는 것만으로도 문제가 해결됩니다.
struct MyViewController : View {
@State var details: String?
@State var showDetails = false
// @Binding var havingAbindingFixesIt: String?
var body: some View {
VStack {
// Text(details ?? "")
Text("Tap here for details")
.onTapGesture {
self.details = "These are the details"
self.showDetails.toggle()
}
.sheet(isPresented: $showDetails) { Text(details ?? "") }
}
}
}