Разработано на Xcode 11.4 с использованием SwiftUI
Использование любого компонента из UIKit в SwiftUI необходимо было заключить в оболочку UIViewRepresentable. Но сначала, нам нужно понять, каковы основные требования для WKWebView.
- Состояния загрузки веб-страниц
- Заголовок веб-страницы, отображаемый при навигации.
- Пользователи могут вернуться на старые страницы.
- Делегаты при необходимости
Для пунктов 1–3 нам потребуется двусторонняя привязка. Если действие пользователя (например, вернуться на предыдущую страницу и т. Д.) Может быть передано в WKWebView, а WKWebView может передать информацию обратно, чтобы мы могли обновить состояние навигации и загрузки.
class WebViewStateModel: ObservableObject { @Published var pageTitle: String = "Web View" @Published var loading: Bool = false @Published var canGoBack: Bool = false @Published var goBack: Bool = false }
Для делегатов мы можем использовать обратные вызовы или комбинировать. В этом руководстве я использую обратный вызов с делегированием на основе перечисления.
enum NavigationAction { case decidePolicy(WKNavigationAction, (WKNavigationActionPolicy) -> Void) //mendetory case didRecieveAuthChallange(URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) //mendetory case didStartProvisionalNavigation(WKNavigation) case didReceiveServerRedirectForProvisionalNavigation(WKNavigation) case didCommit(WKNavigation) case didFinish(WKNavigation) case didFailProvisionalNavigation(WKNavigation,Error) case didFail(WKNavigation,Error) }
Протокол UIViewRepresentable требует от нас реализации makeUIView, updateUIView, makeCoordinator, UIViewType, и т.д. Итак, теперь попробуем создать оболочку WebViewWrapper для SwiftUI.
Теперь, когда мы закончили создание представления, нам нужно установить делегат навигации координатора.
Теперь мы создаем наш WebView с помощью WebViewWrapper:
Как использовать:
Полный код: