我正在尝试基于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永远不会被调用,因此点击不会在外部启动。
答案 0 :(得分:2)
继承UIWebView
通常是一个坏主意,文档特别建议不要这样做。我不确定,但我的猜测是UIWebView
是一个类群。
要获得所需的效果,您可以尝试将NewsView设为普通UIView
,然后将UIWebView
添加为子视图。从那里你可以将UIWebView委托设置为NewsViewDelegate,而不必担心子类。
最好的方法可能是创建一个NewsViewController类来加载NewsView并实现UIWebViewDelegate
方法本身,并将NewsView webView委托设置为NewsViewController。
答案 1 :(得分:1)
您遮蔽 webview的现有delegate
属性。尽量不要在子类中包含delegate
属性。它应该是遗传的。