85477


onOpenURL(Deep Link)で渡されたURLを別画面(TimeLineView)に渡したいのですが、なぜかnilになってしまいます。

タイミング的には、値が入っているはずなのですが、nilになってしまい`Text("nothing")`が表示されてしまいます。

なぜか以下のコードを追加するとちゃんと値が渡されるようになります。

[code]

    .onChange(of: url) { value in
    }
    
[/code]

[code]

    import SwiftUI
    
    @main
    struct TwitterApp: App {
      @State var showTimeLineView:Bool = false
      @State var url: URL?
      
      var body: some Scene {
        WindowGroup {
          ContentView()
            .onOpenURL { url in
              self.url = url
              showTimeLineView.toggle()
            }
            .sheet(isPresented: $showTimeLineView) {
              if let url = url {
                TimeLineView(url: url)
              } else {
                Text("nothing")
              }
            }
        }
      }
    }
    
[/code]


CC BY-SA 4.0
2022-01-03T16:11:24.587
85467
2022-01-04T03:42:06.117
40856
question
swift swiftui
SwiftUIのonOpenURL(Deep Link)で渡されたURLを別画面に渡せない


現在のSwiftUI実装では、`sheet`などに渡すクロージャー内で`@State`変数をキャプチャしている場合、それらの`@State`変数が期待通りに動かないと言う問題点が報告されています。

ご自身で見つけられたように、`sheet(item:onDismiss:content:)`なんかを使うのも一つの解決方法ですが、`sheet`で表示したい内容を別Viewにして、`@Binding`を渡すと言う方法でも解消できることが知られています。

[code]

    import SwiftUI
    
    @main
    struct OnOpenURLToSheetApp: App {
        @State var showTimeLineView:Bool = false
        @State var url: URL?
        
        var body: some Scene {
            WindowGroup {
                ContentView()
                    .onOpenURL { url in
                        self.url = url
                        showTimeLineView.toggle()
                    }
                    .sheet(isPresented: $showTimeLineView) {
                        MySheet(url: $url)
                    }
            }
        }
    }
    
    struct MySheet: View {
        @Binding var url: URL?
        
        var body: some View {
            if let url = url {
                TimeLineView(url: url)
            } else {
                Text("nothing")
            }
        }
    }
    
[/code]

お試しください。


CC BY-SA 4.0
2022-01-04T03:42:06.117
85477
2022-01-04T03:42:06.117
13972
85467
answer