objective-c - Objective C - iOS - UIWebView 保留在 ARC 中,但未调用委托(delegate)方法

标签 objective-c ios uiwebview automatic-ref-counting retain

我对 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/

相关文章:

objective-c - 表格 View 启用编辑时如何设置附件类型?

ios - Fabric Crashlytics : Upload-Symbols behind proxy (with FaSTLane)

ios - NSFetchedResultsController 创建日期为零的部分

iphone - 将 2 个 UIImage 添加到一个 UIImage

ios - 如何在UIImage中优化内存使用

ios - 尝试仅允许某些字符串进入 URL 栏

iOS 7 不调用 layoutSubviews

ios - UICollectionView 中的单元格左对齐

objective-c - RubyMotion 中的 UINavigationBar 外观不起作用

ios - Swift youtube ios helper 全屏抛出异常