【问题标题】:UIWebView will not loadRequest inside a separate class fileUIWebView 不会在单独的类文件中加载请求
【发布时间】:2026-01-01 11:10:01
【问题描述】:

我有一个UIWebView,它是从包含的类文件中成功动态创建的(我认为......没有错误被吐出)。我在 Foo.m 类文件中创建这个 webview 的函数是:

+(void) openWebView {
  dispatch_async(dispatch_get_main_queue(), ^{
    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 16, 16)];
    [webView setDelegate:self];
    [webView setHidden:YES];
    NSURL *url = [NSURL URLWithString:address];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
    [webView loadRequest:urlRequest];
    NSLog(@"Successful web open: ", url); 
  });
}

我确实在setDelegate 行上收到了一条警告错误消息(虽然它不会使应用程序崩溃),内容如下:

不兼容的指针类型将“const Class”发送到“id:”类型的参数

问题在于,虽然NSLog 确实记录了它试图打开的正确 URL,但该页面实际上从未被调用(我可以告诉这一点,因为我在该页面上有一个 PHP 计数器,每次打开时都会递增)。

所以我的问题是:

  1. 我是否在 .h 文件中遗漏了某些内容?我没有添加任何内容 尊重这个新的 WebView
  2. 我觉得我错过了self 引用的对象。还提到了here in my precursor question
  3. 如何查看loadRequest 的回复

对不起大家,你可能从我的问题中可以看出,Obj-C 对我来说有点新,但我在这里真的很挣扎,希望能得到帮助!谢谢。

【问题讨论】:

    标签: objective-c ios xcode uiwebview uiwebviewdelegate


    【解决方案1】:

    您正在实现一个类方法(由+ 符号表示)。类方法中的self 指的是类本身,而不是实例。 UIWebView(或其他任何东西)的 delegate 必须是一个对象。

    【讨论】:

      【解决方案2】:

      您的openWebView 方法是一个类方法,因为开头的+。因此,您没有对象。 self 在这种情况下返回类(因此发出警告)。也许您希望openWebView 成为实例方法,因此将+ 更改为-,然后self 将指向您的实例化对象。

      要检查 loadRequest 是否有效,请在您的委托(即 Foo.m)中实现 UIWebViewDelegate 委托方法 webViewDidStartLoadwebViewDidFinishLoad 并查看它们是否被调用。

      【讨论】:

      • 在将 + 更改为 - 后,我需要添加到我的 Foo.h 文件吗?我问是因为我这样做了,现在我的应用程序崩溃了。
      • 你如何调用openWebView?您在调试器中遇到什么错误?
      • 我在同一个类文件中的另一个方法中调用它。 -(void) startTheWebView { [...] } 错误是target没有实现选择器...
      • 所以你用[self openWebView] 调用它?
      • 您的loadRequest 也可能有其他问题。为什么不在您的委托(即 Foo.m)中实现委托方法 webViewDidStartLoadwebViewDidFinishLoad 并查看它们是否被调用。