Как я могу получить методы делегата UISWrollView UIScrollView, вызываемые из стандартного UIViewController? - PullRequest
4 голосов
/ 11 июля 2011

Так что у меня просто есть стандартный UIViewController с UIWebView в нем, который отображает PDF.Что касается функциональности приложения, мне нужно иметь возможность отвечать на вложенные события UISWrollView UIWebView, такие как scrollViewWillBeginDragging, scrollViewDidScroll и т. Д.

Единственный способ получить доступ к scrollView - это (похоже на хак) зайдите и получите его с помощью массива subviews:

for (id subview in webView.subviews){
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])  {
        UIScrollView * s = (UIScrollView*)subview;
        s.delegate = self;
        s.tag = 1;
        scrollView = s;
    }
}

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

Итак, чтобы подвести итогчто мне нужно:

Каков наилучший способ установить мой класс UIViewController в качестве делегата UIScrollView внутри UIWebView? Есть ли что-то, что мне нужно сделать с подклассом моего собственногоUIWebView, чтобы он обрабатывал события из встроенного в UIWebView определенного способа, а затем каким-то образом передавал его в UIViewController?Как все-таки работает эта мимолетная вещь?

Пожалуйста, сообщите!

Спасибо!

1 Ответ

4 голосов
/ 11 июля 2011
  1. Вы проверяли, есть ли только один подкласс UIScrollView во вложенных представлениях? Затыкай бревно в своей петле, чтобы увидеть. Если их больше одного, то вы получите только последний, используя свой код.

  2. Если существует только один подкласс UIScrollView, вы можете попробовать сохранить ссылку на его делегат, а затем в ваших собственных методах делегата передать сообщения после того, как вы закончили свою работу.

Итак, в вашем цикле, что-то вроде

originalDelegate = s.delegate

А затем для методов делегата, что-то вроде:

- (void) scrollViewDidScroll: (UIScrollView*) scrollView;
{
     // do your stuff

     [originalDelegate scrollViewDidScroll: scrollView];
}

Вам может потребоваться проверить, отвечает ли originalDelegate на селектор, прежде чем вызывать его, т.е. в протоколе делегата UIScrollView.

Не проверял это, поэтому будет интересно узнать, можно ли заставить его работать. Обратите внимание, что в документах прямо сказано, что UIWebView «не должен быть разделен на подклассы»

...