我对 ARC 有疑问。它不保留 WebView 。场景是我必须将 webview 从一个 viewcontroller 发送到另一个 viewcontroller。原因是当用户搜索某些东西时,我想将他带到一个带有其他选项的新屏幕。 (我必须使用相同的 webview)
这是示例代码:我有一个 ViewController1,它有一个 webview(我在 xib 中添加了它。)我正在加载 say google 在其中,一旦用户搜索某些内容并且加载完成后,我必须带他去到新的 View Controller 并在新的 View Controller 中显示相同的 webview。
//ViewController1
@interface ViewController1 : UIViewController <UIWebViewDelegate>
@property (nonatomic, retain) UIWebView* testWebView;
@end
@implementation ViewController1
@synthesize testWebView;
- (void)viewDidLoad
{
[super viewDidLoad];
testWebView = [[UIWebView alloc]init];
testWebView.delegate = self;
[testWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.com"]]];
}
-(void)webViewDidFinishLoad:(UIWebView *)webView{
NSString *html = [testWebView stringByEvaluatingJavaScriptFromString:
@"document.body.innerHTML"];
if ([self.testWebView.request.url.absoluteString rangeOfString:@"output=search"].location != NSNotFound) {
ViewController2* newViewController = [[ViewController2 alloc] init];
[newViewController setTestWebView:self.testWebView];
[self.navigationController setViewControllers:[NSArray arrayWithObject:newViewController] animated:NO];
}
}
- (void)dealloc{
[self.testWebView stopLoading];
self.testWebView.delegate = nil;
self.testWebView = nil;
}
在第二个 View Controller 中,我在延迟 10 秒后加载 stackoverflow.com。问题是它加载 stackoverflow 很好,但它没有调用任何委托(delegate)方法。为什么?
@interface ViewController2 : UIViewController <UIWebViewDelegate>
@property (nonatomic, retain) UIWebView* testWebView;
@end
@implementation ViewController2
@synthesize testWebView;
- (void)viewDidLoad
{
[super viewDidLoad];
self.testWebView.delegate = self;
[self.view addSubview:testWebView];
[self performSelector:@selector(loadDifferentPage) withObject:nil afterDelay:10];
}
-(void)loadDifferentPage{
[self.testWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.stackoverflow.com/"]]];
}
-(void)webViewDidStartLoad:(UIWebView *)webView{
NSLog(@"%s", __PRETTY_FUNCTION__);
}
-(void)webViewDidFinishLoad:(UIWebView *)webView{
NSLog(@"%s", __PRETTY_FUNCTION__);
}
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSLog(@"%s", __PRETTY_FUNCTION__);
return YES;
}
ViewController2 保留了 webview,但未调用委托(delegate)方法。为什么?
谢谢 赛
最佳答案
ViewController1 delloc 方法导致了问题:
如果我取消对 self.textWebView.delegate = nil 的注释,它就可以正常工作。原因是首先我们为 newViewController 设置了 webview,然后在 ViewController1 的 dealloc 中我们将其委托(delegate)设置为 nil。
- (void)dealloc{
[self.testWebView stopLoading];
if(self.testWebView.delegate == self)
self.testWebView.delegate = nil;
self.testWebView = nil;
}
关于objective-c - Objective C - iOS - UIWebView 保留在 ARC 中,但未调用委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10821711/