2017-01-02 9 views
0

ここでの目標は、webViewのURLが変更されるたびに検出することです。 WKWebViewクラスのdidCommitdidStartProvisionalNavigationの機能は、WebView内の特定の要素を操作するときに必ず発生するとは限りません.WebViewのURL値が変更されたときに、オブザーバを追加する必要があります。Obj-CオブザーバをSwift構文に変換する際に問題が発生しました

これまでのところ、私は名前checkURLと私自身の通知の拡張作成しました:

スウィフト進捗

extension Notification.Name { 
    static let checkURL = Notification.Name("checkURL") 
} 

NotificationCenter.default.post(name: .checkURL, object: nil) 
NotificationCenter.default.addObserver(self, selector: #selector(getter: webView.url), name: .checkURL, object: webView.url) 

Objective-Cのソリューションを(KVO)

// Add an observer 
[webView_ addObserver:self forKeyPath:@"URL" options:NSKeyValueObservingOptionNew context:NULL]; 

// Method that gets called when the URL value changes 
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { 
    // Code 
} 

どうだろう私はObjective-Cコードを使ってURLの値が変わるたびに機能しますか?私はまだ通知の周りに頭を抱えて、オブジェクトの値をどのように扱うのかを考えているので、どんな説明も非常に便利です!

ありがとうございます! didCommitdidStartProvisionalNavigationは常に発射していないようですので、PHPだけでなく、JavaScriptベースのサイトで作業する場合は特に(

EDIT:だけで物事をクリアするために、私は私の質問を言い替えるます - #などの記号でURLが変更されていることが常に見られます。しかし、前述のように、組み込みのWKWebView関数はそれらを捕捉していないようです。だから私がここでやろうとしているのは、それが単なる#なのかどうかにかかわらず、URLに加えられた変更を捕まえるための回避策を見つけることです。 :)

+0

これは、あなたがeffectiを持って三回目です尋ねると同じ質問をしました。やめてください。 – matt

答えて

1

まず、この回答の(かなりの)仮定を許してください。しかし、私は説明を求めることはできません。

第2に、私はNSNotificationCenter referenceをよく読んでください。また、私が正しく覚えていれば、通知についてのthis writeupは私にとって最初に非常に役に立ちました。

実際のコードにしてください。あなたの苦境を理解していれば(常にObjective-CとSwiftを一緒に使う必要はありません)、あなたはSwiftコードが新しいURLで何かをすることができるようにURL変更に関する通知を出しています。

通知のためにあなたのスワイプコードがを聞いているので、あなたはそれをそこに掲示したくありません。むしろ、通知は次のようにKVOコールバックに掲示しなければならない:

// I have also changed the 'URL' to 'url' as I suspect that KVO is case-sensitive 
// and replaced NULL with nil as it is generally a better practice to use it. 
[webView_ addObserver:self forKeyPath:@"url" options:NSKeyValueObservingOptionNew context:nil]; 

// Method that gets called when the URL value changes 
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { 
    if (sender == webView_ && [keyPath isEqualToString:@"url"]) { 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"checkURL" object:self]; 
    } 
} 

これはあなたのスウィフトクラスのように、任意のオブザーバに通知を送信します。あなたがないは、あなたのスウィフトコード内のWebViewへの参照を持っていない場合に通知を掲示する場合さて、あなたはユーザ情報パラメータに値を渡すことができ

extension Notification.Name { 
    static let checkURL = Notification.Name("checkURL") 
} 

// Notice that the call to post(name:object:) has been removed. 

// The 'object' parameter is only used for filtering out the sender of the notification. 
NotificationCenter.default.addObserver(self, selector: #selector(doSomething(notification:)), name: .checkURL, object: nil) 

// We can get the notification in the first parameter. 
func doSomething(notification: Notification) { 
    // Do something, like reading the URL from the web view. 
} 

:スウィフトコードは次のように変更しなければならないであろう、次のように:

[[NSNotificationCenter defaultCenter] postNotificationName:@"checkURL" object:self userInfo:@{ @"url" : webView.url }]; 

次にあなたが通知コールバックでのUserInfoを読むことができます:

func doSomething(notification: Notification) { 
    let url = notification.userInfo["url"] 
    // Do something with the url. 
} 
+0

ご協力いただきありがとうございます!私は現在、これを実装しようとしています。私もこのWebサイトを見つけました。これは完全にSwift(そしてObjective-Cゼロ)を使った回避策を実装するのに役立ちます:http://tulusha.com/kvo-in-swift/ –

+0

本当に必要なのは、これはすべて迅速かつただそれを必要とする誰のためにそこから通知を発する?それは、質問でもう少し明確化を使用することができます)、 – czaurel

+0

はい、正確です。 'didCommit'と' didStartProvisionalNavigation'は必ずしも起動するとは限りません(特にJavaScriptベースのサイトやPHPで作業している場合は、URLに '# 'やその他の記号などのシンボルが変更されています)。しかし、前述のように、組み込みのWKWebView関数はそれらを捕捉していないようです。だから、私がここでやろうとしていることは、それが単なる '#'なのかどうかにかかわらず、URLに加えられた変更を捕らえるための回避策を見つけることです。 –

関連する問題