WKWebView 行为。图像选择器后重新加载 returns

WKWebView behavior. Reloading after Image picker returns

我发现 WKWebview 有奇怪的行为。恢复问题是在网页内容请求图像后,应用程序自动打开图像选择器控制器,在 select 图像后,WKWebview 开始重新加载整个页面,我失去了当前状态,所以图像select离子不起作用。

wkwebview 包含在自定义导航控制器中,而该导航控制器包含在 ViewController 中。

这是一小部分代码:

if(isNewProfile)
    _webvc = [[DJTWebViewVC alloc] initWithOutDataObject:_dataUser];
else
    _webvc = [[DJTWebViewVC alloc] initWithDataObject:_dataObject];

CGFloat WEBNAVOFFSET = [self setWebNavOffset];

_webnav = [[DJTWebNavVC alloc] initWithRootViewController:_webvc];
[_webnav.view setFrame:CGRectMake(0.0, 0.0, c_width, c_height-WEBNAVOFFSET)];

[self.view addSubview:_webnav.view];

图像选择器是从 webvc 调用的,它是 wkwebview 主机。这里可以看到webnav包含webvc,self.view包含webnav。我想这就是问题所在。有没有办法设置应该触发图像控制器的视图?或者有人遇到这个问题并且有解决方法吗?

因为问题是网络视图被调用的方式,所以我用来让它工作的解决方案是这样的。首先定义一个全局变量来知道之前是否加载过web视图,所以这样初始化:

@property (nonatomic, assign) BOOL isPreviouslyLoaded;

viewDidLoad 函数中我添加了这个:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    ...
    
    self.isPreviouslyLoaded = NO;
}

然后在 viewDidAppear 函数中我这样使用了问题的完整代码:

- (void)viewDidAppear:(BOOL)animated
{
    if(!self.isPreviouslyLoaded){
        [self loadWkWebNavigationController: YES];
        self.isPreviouslyLoaded = YES;
    }
}

最后加载网络视图的代码:

- (void)loadWkWebNavigationController:(BOOL)isNewProfile
{
    if(isNewProfile)
        _webvc = [[DJTWebViewVC alloc] initWithOutDataObject:nil];
    else
        _webvc = [[DJTWebViewVC alloc] initWithDataObject:nil];
    
    CGFloat WEBNAVOFFSET = [self setWebNavOffset];
    
    _webnav = [[DJTWebNavVC alloc] initWithRootViewController:_webvc];
    [_webnav.view setFrame:CGRectMake(0.0, self.navigationController.navigationBar.bounds.size.height+WEBNAVOFFSET, self.view.bounds.size.width, self.view.bounds.size.height-self.navigationController.navigationBar.bounds.size.height-WEBNAVOFFSET)];
        
    [self.view addSubview:_webnav.view];
    
}

这是我不重新加载以前加载过的视图的方式。

我找到问题了。每次 NavigationView 出现时,我都在重新加载 webview。所以我添加了一些代码来防止主机名与我想要的匹配时重新加载。