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。所以我添加了一些代码来防止主机名与我想要的匹配时重新加载。
我发现 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。所以我添加了一些代码来防止主机名与我想要的匹配时重新加载。