前提
Swift playgroundsでwebを開くシステムを作っています。
実現したいこと
- 読み込みボタン、前に進む、後ろに戻るボタンを実装する
該当のソースコード
swift(playgrounds)
1 2import SwiftUI 3 4struct ContentView: View { 5 var body: some View { 6 7 MyWebView(url: "https://www.google.co.jp/") 8 } 9} 10 11struct ContentView_Previews: PreviewProvider { 12 static var previews: some View { 13 ContentView() 14 } 15} 16
Swift(playgrounds)
1 2import SwiftUI 3import WebKit 4 5struct MyWebView: UIViewRepresentable { 6 7 let url: String 8 private let observable = WebViewURLObservable() 9 10 /// 監視する対象を指定して値の変化を検知する 11 var observer: NSKeyValueObservation? { 12 observable.instance 13 } 14 15 // MARK: - UIViewRepresentable 16 /// 表示するViewのインスタンスを生成 17 /// SwiftUIで使用するUIKitのViewを返す 18 func makeUIView(context: Context) -> WKWebView { 19 WKWebView() 20 } 21 22 // MARK: - UIViewRepresentable 23 /// アプリの状態が更新される場合に呼ばる 24 /// Viewの更新処理はこのメソッドに記述する 25 func updateUIView(_ uiView: WKWebView, context: Context) { 26 27 /// WKWebViewのURLが変わったこと(WebView内画面遷移)を検知して、URLをログ出力する 28 observable.instance = uiView.observe(\WKWebView.url, options: .new) { view, change in 29 if let url = view.url { 30 print("Page URL: \(url)") 31 } 32 } 33 uiView.allowsBackForwardNavigationGestures = true 34 /// URLを指定してWebページを読み込み 35 uiView.load(URLRequest(url: URL(string: url)!)) 36 37 } 38} 39 40// MARK: WKWebViewのURLが変わったこと(WebView内画面遷移)を検知するための `ObservableObject` 41private class WebViewURLObservable: ObservableObject { 42 @Published var instance: NSKeyValueObservation? 43} 44
swift(playgrounds)
1import SwiftUI 2 3@main 4struct MyApp: App { 5 var body: some Scene { 6 WindowGroup { 7 ContentView() 8 9 } 10 } 11} 12
補足情報
あなたの回答
tips
プレビュー