2012-01-02 20 views
2

在我的iPhone應用程序設置我的UIWebView的委託文件的所有者,但他並沒有叫uiscrollviewdelegate方法的UIWebView不是要求UIScrollViewDelegate方法

我的代碼是

- (void)webViewDidStartLoad:(UIWebView *)webView{ 
    NSLog(@"webViewDidStartLoad "); 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView{ 
    NSLog(@"webViewDidFinishLoad "); 
} 
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ 

    NSLog(@"scrollViewDidEndDecelerating "); 
} 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 

    NSLog(@"scrollViewDidScroll "); 
} 

但我正在逐漸

webViewDidStartLoad 
webViewDidFinishLoad 

這些消息在控制檯中。

有什麼不對我

在此先感謝

+0

[此鏈接](http://fr.ivolo.us/posts/iphone-custom-gestures-on-your-uiwebview)正是你想要的。或者在這裏下載[自定義webView文件](http://cl.ly/0K2s1m2A3u3g09032V02) – tipycalFlow 2012-01-03 09:06:54

回答

6

UIWebViewdelegate屬性僅允許您設置的委託爲UIWebViewDelegate協議。 (查找hereUIWebView參考。)

UIWebView本身就是一種UIScrollViewDelegate,在它接收到的代表從它包含UIScrollView呼叫。不幸的是,您沒有該UIScrollView的API訪問權限,因此您無法更改其委託;因此,它仍然是硬編碼到UIWebView本身。

現在,有幾種方法可以嘗試獲取這些委託消息。

你得到UIScrollViewDelegate調用的一種方法是子類化UIWebView,如果有效的話。無論如何,您應該非常小心,因爲根據您的操作,您可能會破壞完整性,某些功能可能會停止工作(可能還會有一些未來的SDK版本)。此外,蘋果不鼓勵這樣做,儘管它不會讓你的應用程序被拒絕(許多人已經報道了這一點,並沒有任何問題與應用程序商店批准)。

另一種方法是遍歷UIWebViewsubviews,直到找到UIScrollView對象,然後更改其委託。

​​

我不知道這是否是可靠的或可能破壞任何東西,因爲UIWebViewUIScrollView子之間的耦合是很緊,沒有任何地方所描述的,但你可以試試。總而言之,我不認爲這比子類化UIWebView好多了。

最後,第三種方法是定義自己的UIWindow類型。這將允許您覆蓋幾個關鍵方法(sendEventhitTest:event:),以便您可以截取之前的觸摸,它們在視圖級別進行分派。這會給你一個處理它們的機會,並在必要時阻止它們達到它們的原始目標。

這是最乾淨的解決方案,雖然它是更多的工作,它會要求你定義一個自定義的UIWindow你做所有的觸摸識別/調度。

描述如何覆蓋sendEvent的教程可用here

+0

在他們的'UIWebview'參考中,Apple說'UIWebView類不應該被子類化。' – tipycalFlow 2012-01-02 09:26:00

+0

謝謝@tipycalFlow。無論如何,必須考慮到OP正試圖做一些超出Apple允許的事情;所以,在這種特殊情況下,它可能會忽略蘋果關於「UIWebView」覆蓋的建議。當然,我們不能保證事情能夠正常工作,或者他們未來不會破產。 – sergio 2012-01-02 09:44:34

+0

的確,真的...此外,這不會工作'[webView子視圖]'。 [這個鏈接](http://fr.ivolo.us/posts/iphone-custom-gestures-on-your-uiwebview)討論瞭如何正確地繼承「UIWebview」。 – tipycalFlow 2012-01-02 09:54:52

0

自iOS2以來,UIWebView的scrollView實際上具有可寫的委託屬性。 它適用於我使用它。

3

對於那些在SWIFT 3溶液後尋找:

集UIScrollViewDelegate然後這裏有一個例子:

var noticias: UIWebView! 
noticias.scrollView.delegate = self 
1

的UIWebView有它自己的UIScrollView.Maybe你可以嘗試這樣的self.webView.scrollView.delegate = self;

相關問題