【问题标题】:IOS/Objective-C: Deallocate web view in Detail View ControllerIOS/Objective-C:在 Detail View Controller 中释放 Web 视图
【发布时间】:2017-07-25 15:07:39
【问题描述】:

我有一个主表和详细视图控制器。详细信息 VC 通过 Web 视图显示 URL。

如果使用主/详细设置的内置导航,如果我返回然后按不同的表格单元格,详细视图将更新 Web 视图。无论我使用UIWebView 还是WKWebView,都是如此。

但是,在详细视图中,无需返回表格,我想为用户提供通过同一个 Web 视图查看多个 URL 的选项。我试图通过更改请求的 url 在 vi​​ewwillappear 中做到这一点。但是,UIWebView(或 WKWebView)继续显示相同的 URL。我似乎无法摆脱第一个网址。

我已经尝试了各种方法来关闭或停止现有的 web 视图、清除缓存、删除 cookie 等,然后重新加载新的,但仍然看到相同的 url。将不胜感激任何建议。这是我的代码和我尝试过的一些不起作用的东西:

      -(void) changeURL: (NSNumber*)param {
      NSURL *testurl1=[NSURL URLWithString:@"http://www.apple.com"];
      NSURL *testurl2 =[NSURL URLWithString:@"http://www.google.com"];
      //if param is 1 {
      _urlToLoad = testurl1;}
      else {
      _urlToLoad = testurl2;}
      }
Edit: Method below is updateInterface, not viewWillAppear
     -(void) updateInterface {
        UIWebView *webView;
        NSURLRequest *request=[NSURLRequest requestWithURL:_urlToLoad];
          webView = nil;//This blocks the web view from loading at all for some reason I can't understand.  Setting wkWebView to nil does not block loading.
        [webView stopLoading];//no effect
        [webView loadRequest:request]; 
        [[NSURLCache sharedURLCache] removeCachedResponseForRequest:request];
            [[NSURLCache sharedURLCache] removeAllCachedResponses];
            NSString *myDomain = @"www.google.com";
            for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {

                if([[cookie domain] isEqualToString:myDomain]) {

                    [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
                }
            }
     //wkwebview version
            WKWebView *wkwebView;
            WKWebViewConfiguration *wkConfig = [[WKWebViewConfiguration alloc] init];
            wkwebView = nil;
            wkwebView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:wkConfig];
            wkwebView.navigationDelegate = self;
            [wkwebView loadRequest:request];

            [webView addSubview:wkwebView];

            CGRect webFrame = [[UIScreen mainScreen] applicationFrame];
            webFrame.origin.y = 100.0; // statusbar
            webFrame.origin.y -= 100.0; // statusbar 20 px cut from y of frame
            webView = [[UIWebView alloc] initWithFrame:webFrame];
           }

【问题讨论】:

  • 这有点令人困惑...如果您在 viewWillAppear 中注释掉 所有 代码,您会得到一个具有 Web 视图的“详细信息 VC”吗它会加载一个 URL?如果是这样,设置 that URL 的代码在哪里?
  • 是的,我可以在第一次使用 [webView loadRequest:request1];或者 [wkwebView loadRequest:request1]。还有另一种方法未显示指定request2。加载 request1 后,我无法让它加载 request2。卡在 request1 上;
  • 我编辑了问题以使其更清晰
  • 你在哪里打电话changeURL
  • 响应 UIGestureRecognizer

标签: ios objective-c uiwebview wkwebview


【解决方案1】:

UIViewController 方法“viewWillAppear”在 Objective-C 中具有以下签名:

- (void)viewWillAppear:(BOOL)animated

,您在没有任何参数的情况下实现了它。

结果是,它不会被视为超类UIViewController 中定义的原始方法的覆盖,而是被视为您的子类引入的全新自定义方法;除非你在某处显式调用它,否则它永远不会执行。

来源:SDK Reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多