以编程方式设置UIWebViewDelegate

时间:2010-02-07 03:19:52

标签: iphone objective-c uiwebview static-libraries

我正在尝试基于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;
}

不幸的是,shouldStartLoadWithRequest永远不会被调用,因此点击不会在外部启动。

2 个答案:

答案 0 :(得分:2)

继承UIWebView通常是一个坏主意,文档特别建议不要这样做。我不确定,但我的猜测是UIWebView是一个类群。

要获得所需的效果,您可以尝试将NewsView设为普通UIView,然后将UIWebView添加为子视图。从那里你可以将UIWebView委托设置为NewsViewDelegate,而不必担心子类。

最好的方法可能是创建一个NewsViewController类来加载NewsView并实现UIWebViewDelegate方法本身,并将NewsView webView委托设置为NewsViewController。

答案 1 :(得分:1)

遮蔽 webview的现有delegate属性。尽量不要在子类中包含delegate属性。它应该是遗传的。