Установка UIWebViewDelegate программно - PullRequest
1 голос
/ 07 февраля 2010

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

NewsView.h:

@interface NewsView : UIWebView {
   NSObject<UIWebViewDelegate> *delegate;
}
@property (nonatomic, assign) IBOutlet NSObject<UIWebViewDelegate> *delegate;

В реализации все мои методы инициализации вызывают общий метод viewInit

NewsView.m

@implementation NewsView

@synthesize delegate;

- (void)viewInit {

    self.delegate = [[NewsViewDelegate alloc] init];
}

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

NewsViewDelegate.h

@interface NewsViewDelegate : NSObject <UIWebViewDelegate> {
}

NewsViewDelegate.m

// Intercept URL events
- (BOOL)webView:(UIWebView *)myWebView shouldStartLoadWithRequest:
    (NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    NSLog(@"URL Changed");
    // Check to see if this is a click event
    if (navigationType == UIWebViewNavigationTypeLinkClicked) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[[request URL]            absoluteString]]];
            return NO;
    }

    return YES;
}

К сожалению, mustStartLoadWithRequest никогда не вызывается, поэтому щелчки не запускаются извне.

Ответы [ 2 ]

2 голосов
/ 07 февраля 2010

Подкласс UIWebView, как правило, является плохой идеей, и документы специально рекомендуют это. Я не знаю точно, но я предполагаю, что UIWebView - это кластер классов.

Чтобы получить желаемый эффект, вы можете попробовать сделать NewsView простым UIView, а затем добавить UIWebView в качестве подпредставления. Оттуда вы можете установить делегата UIWebView в NewsViewDelegate, не беспокоясь о подклассе.

Наилучшим методом может быть создание класса NewsViewController, который загружает ваш NewsView и сам реализует методы UIWebViewDelegate и устанавливает делегат NewsView webView для вашего NewsViewController.

1 голос
/ 07 февраля 2010

Вы отслеживаете существующее delegate свойство веб-просмотра. Попробуйте просто не включать свойство delegate в свой подкласс. Это должно быть унаследовано.

...