我正在尝试构建一个基于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从来没有被调用,所以点击没有被外部启动。
发布于 2010-02-07 03:43:32
子类UIWebView通常是个坏主意,而文档专门建议不要这样做。我不确定,但我猜UIWebView是一个类集群。
为了达到您想要的效果,您可以尝试将您的NewsView变成普通的UIView,然后添加UIWebView作为子视图。在那里,您可以将UIWebView委托设置为NewsViewDelegate,而不必担心子类。
最好的方法可能是创建一个NewsViewController类,该类加载NewsView并实现UIWebViewDelegate方法本身,并将NewsView webView委托设置为NewsViewController。
发布于 2010-02-07 03:36:34
您正在跟踪webview的现有delegate属性。尝试在子类中不包含delegate属性。它应该继承下来。
https://stackoverflow.com/questions/2215764
复制相似问题