SwiftUI @State 및 .sheet () ios13 대 ios14

Sep 17 2020

안녕하세요 저는 여기서 문제가 발생하고 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에서 잘못 되었습니까?

추신 : 클로저에서 전달되는 몇 가지 다른 변수가 있습니다.

답변

4 Asperi Sep 18 2020 at 03:15

코드에 뷰 업데이트 / 생성 순서가 예상되지만 일반적으로 정의되지 않았습니다 (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)
        }
    }
}
2 Othyn Oct 04 2020 at 21:59

이것은 문서화되지 않은 것으로 보이는 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)
    }
}
valexa Nov 19 2020 at 11:06

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 ?? "") }
        }
    }
}