2017-01-10 1 views
3

У меня есть код, который загружает несколько веб-страниц, используя WKWebView. Есть ли способ подключить уникальную функцию обработчика завершения для каждого вызова WKWebView.loadHTMLString.Добавить уникальный обработчик завершения для каждой загрузки WKWebView

Я заметил, что каждый возвращает WKNavigation?, но я не хочу использовать WKNavigationDelegate, так как это относится ко всем событиям загрузки.

К примеру, прямо сейчас без обработчика завершения, я делаю это:

wkWebView?.loadHTMLString("<p>Loading page #1</p>", baseURL: nil) 

Я хотел бы уникальный обработчик завершения, как это:

wkWebView?.loadHTMLString("<p>SLoading page #1</p>", baseURL: nil, completionHandler: { 
    print("Loaded page #1. Doing things only required for page #1.") 
}) 

Тогда для другой нагрузки я мог бы изменить обработчик завершения:

wkWebView?.loadHTMLString("<p>SLoading page #2</p>", baseURL: nil, completionHandler: { 
    print("Loaded page #2") 
}) 
+0

Таким образом, вы знаете, что вы дали объект WKNavigation но _refuse использовать it_ именно для той цели, для которой они дают его вам ???? – matt

+0

@matt Я не могу использовать 'WKNavigation', поскольку он предназначен для всех событий навигации, делегированных одному объекту (если я понимаю его цель). У меня есть несколько объектов, которым необходимо загрузить строку HTML, а затем выполнить некоторые действия. Что-то похоже на [оценкаJavaScript (_: completionHandler:)] (https://developer.apple.com/reference/webkit/wkwebview/1415017-evaluatejavascript), но для загрузки HTML - это то, что я пытаюсь реализовать. – user2560886

+0

Но разве это не просто вопрос маршрутизации сообщений разумно? – matt

ответ

2

Как вы сами справедливо говорите, loadString возвращает a Объект WKNavigation для этой цели. Так просто сделать себе словарь, который связывает этот WKNavigation объект с обработчиком завершения, который вы храните, когда вас называют:

var navs = [WKNavigation :() ->()]() 
func loadString(_ s:String, completionHandler:@escaping()->()) { 
    if let nav = wkWebView?.loadHTMLString(s, baseURL:nil) { 
     self.navs[nav] = completionHandler 
    } 
} 

Теперь, действуя как WKWebView-х navigationDelegate, когда вы слышите, что страница загружена, вы звоните его соответствующий обработчик завершения:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 
    if let f = self.navs[navigation] { 
     f() 
    } 
} 
Смежные вопросы