【问题标题】:Setting a UIWebViewDelegate programmatically以编程方式设置 UIWebViewDelegate
【发布时间】:2010-02-07 03:19:51
【问题描述】:

我正在尝试基于 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 永远不会被调用,因此点击不会从外部启动。

【问题讨论】:

    标签: iphone objective-c uiwebview static-libraries


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢泰森,我会尝试更改并报告。我感谢您的帮助。关于不要子类化的建议,您是否可以分享一个链接?我在developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/… 阅读了概述并没有看到它(或者只是因为文档疲劳而错过了它)。再次感谢!
    • 这些是 OS X WebView 参考,你应该看看 iPhone UIWebView 参考。 developer.apple.com/iphone/library/documentation/UIKit/… 幸运的是,iPhone 文档总是出现在我的搜索中。否则我敢肯定我可能会一直做同样的事情。 :-)
    • 就像 kubi 说的,它在 iPhone 文档中:developer.apple.com/iphone/library/documentation/UIKit/… 在概述中的子类化注释下。 Matt Gallagher 有一篇关于子类集群的好帖子:cocoawithlove.com/2008/12/…
    • 我终于能够再次处理这个问题,创建一个 UIView 并包含一个 UIWebView 效果很好,感谢泰森的建议。我还想提一下,我可以通过将 UIWebView 子类化为 UIWebViewDelegate 来使其工作:@interface NewsView : UIWebView 虽然我不确定何时/是否会在其他地方分崩离析。 UIView 工作得很好,也让我可以将 delgates 保存在我喜欢的单独文件中。
    【解决方案2】:

    您正在隐藏 webview 的现有delegate 属性。尽量不要在您的子类中包含 delegate 属性。它应该被继承。

    【讨论】:

    • 感谢 St3fan,我之前确实尝试过,然后又尝试了一次,但它似乎没有成功。从上面的代码中,我只是注释掉了 .h & .m 中的所有委托定义/合成,但留下了 self.delegate = [[NewsViewDelegate alloc] init];在 viewInit 方法中,但它没有改变行为。我确定这是一个问题,但还有其他问题。再次感谢,非常感谢您抽出宝贵时间进行审查和建议。
    猜你喜欢
    • 2021-11-21
    • 2018-11-26
    • 2011-04-18
    • 2012-07-18
    • 2016-02-15
    • 2014-07-26
    • 1970-01-01
    • 2011-06-06
    • 2012-02-12
    相关资源
    最近更新 更多