UIWebView не вызывает методы UIScrollViewDelegate - PullRequest
2 голосов
/ 02 января 2012

В моем приложении для iphone я назначаю делегата моего 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

эти сообщения в консоли.

Что со мной не так

Заранее спасибо

Ответы [ 4 ]

6 голосов
/ 02 января 2012
Свойство

UIWebView delegate позволяет установить только делегата для протокола UIWebViewDelegate.(Смотрите здесь для UIWebView ссылки.)

UIWebView само по себе является UIScrollViewDelegate, поскольку оно получает вызовы делегатов от UIScrollView, который он содержит.К сожалению, у вас нет API-доступа к этому UIScrollView, поэтому вы не можете изменить его делегат;таким образом, он остается жестко запрограммированным для самого UIWebView.

Теперь есть несколько способов получить эти сообщения делегатов.

Один из способов получить UIScrollViewDelegateзвонки это подкласс UIWebView, если это работает.В любом случае вы должны быть очень осторожны, потому что в зависимости от того, что вы делаете, вы можете нарушить целостность UIWebView, и некоторые функции могут перестать работать (возможно, в будущем выпуске SDK).Кроме того, Apple не рекомендует делать это, хотя это не приведет к отклонению вашего приложения (как и многие люди, которые сообщили об этом и не испытывают проблем с одобрением App Store).

Другим подходом может быть повторение subviews вашего UIWebView до тех пор, пока вы не найдете UIScrollView объект и затем не измените его делегат.

UIScrollView* scrollView = nil;
for (UIView* subview in [webView subviews]) {
   if ([subview isKindOfClass:[UIScrollView class]]) {  
      scrollView = (UIScrollView*)subview;
      scrollView.delegate = <YOUR_DELEGATE_HERE>;
      break;
   }
}

Я не уверен, что это надежно или может что-то сломать, поскольку связь между UIWebViewи его UIScrollView ребенок очень тугой и нигде не описан, но вы можете попробовать.В общем, я не думаю, что это намного лучше, чем создавать подклассы UIWebView.

Наконец, третий подход - это определение собственного типа UIWindow.Это позволит вам переопределить несколько ключевых методов (sendEvent или hitTest:event:), чтобы вы могли перехватывать касания до того, как они будут отправлены на уровне просмотра.Это даст вам возможность справиться с ними и, в случае необходимости, помешает им достичь своей первоначальной цели.

Это самое чистое решение, хотя это и больше работы, и вам потребуется определить пользовательский UIWindow где вы делаете все распознавание / диспетчеризацию касания.

Учебник, описывающий, как переопределить sendEvent, доступен здесь .

3 голосов
/ 16 мая 2017

Для тех, кто ищет решение SWIFT 3:

установите UIScrollViewDelegate, а затем вот пример:

var noticias: UIWebView!
noticias.scrollView.delegate = self
2 голосов
/ 17 мая 2017

UIWebView имеет свой собственный UIScrollView. Возможно, вы можете попробовать вот так self.webView.scrollView.delegate = self;

0 голосов
/ 08 декабря 2014

scrollView UIWebView на самом деле имеет свойство записи делегата начиная с iOS2. Это прекрасно работает для меня, чтобы использовать его.

...