【问题标题】:Where to set delegate在哪里设置委托
【发布时间】:2012-10-30 23:19:30
【问题描述】:

我正在尝试覆盖 UIWebView 对象中的 URL 点击。我知道我需要在设置'webView delegate'的地方添加以下代码(根据this thread):

// TODO: This should intercept URL clicks in a UIWebView, causing (for now) links to open in Safari. It doesn't work yet; possibly it's in the wrong place. Should be in the same place as we 'set the webView delegate'...
// This doesn't appear to be set anywhere yet, which is probably where I'm going wrong.
- (BOOL)webView: (UIWebView*)webView shouldStartLoadWithRequest: (NSURLRequest*)request navigationType: (UIWebViewNavigationType)navigationType {

    if ( navigationType == UIWebViewNavigationTypeLinkClicked ) {
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }

    return YES;
}

但是,我不知道将代码实际放在哪里。关于上述线程的一个建议是将其放在 viewDidLoad 方法中,在“self.webView.delegate = self;”的一行下方。但是,我的 UIWebViews 实际上是自定义 UIView 的一部分,它的调用方式很像 UIAlertView(实际上,它几乎是 UIAlertView 的精确复制品,除了它包含 UIWebView)......所以,我的主应用程序的 ViewController 代码没有“看到” self.webView 对象,所以我不能在那里设置委托。而且,指定我的自定义 UIView 对象(调用 UIWebView 对象)的“m”文件没有 viewDidLoad 方法。

真的很挣扎,大概是因为我不知道代表在哪里设置。

【问题讨论】:

    标签: objective-c delegates


    【解决方案1】:

    而且,指定我的自定义 UIView 对象(调用 UIWebView 对象)的“m”文件没有 viewDidLoad 方法。

    然后放到- initWithFrame:方法中:

    - (id)initWithFrame:(CGRect)frm
    {
        if ((self = [super initWithFrame:frm])) {
             webView = [[UIWebView alloc] initWithFrame:frm]; // or whatever
    
             self.webView.delegate = self;
        }
        return self;
    }
    

    【讨论】:

    • 谢谢!这是一种享受。我确实收到了警告;从不兼容的类型 '*' 分配给 'id'。似乎可以工作...谢谢!
    • .. 所以我可以忽略警告?
    • @CaptainProg 没有。使您的视图类符合UIWebViewDelegate 协议。
    • @CaptainProg 永远不要忽略警告。所有代码都应该编译干净。
    • @CaptainProg 不。将<UIWebViewDelegate> 添加到您的类@interface 的声明中,并阅读全面的Objective-C 教程。
    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多