簡體   English   中英

目標C-iOS-UIWebView保留在ARC中,但未調用Delegate方法

[英]Objective C - iOS - UIWebView getting retained in ARC but Delegate methods are not being called

我在使用ARC時遇到問題。 它不保留Web視圖。 場景是我必須將一個WebView從一個ViewController發送到另一個ViewController。 原因是當用戶搜索某些我想帶他到其他選項的新屏幕時。 (我必須使用相同的網絡視圖)

這是示例代碼:我有一個ViewController1,它有一個webview(我在xib中添加了它)。我在其中加載說google,一旦用戶搜索了某些內容,加載完成后,我必須將他帶到新視圖控制器,並在新的視圖控制器中顯示相同的Web視圖。

//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;
}

在第二個視圖控制器中,我在延遲10秒后加載stackoverflow.com。 問題是它可以很好地加載stackoverflow,但是它沒有調用任何委托方法。 為什么?

@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,但是未調用委托方法。 為什么?

謝賽

ViewController1 delloc方法導致了此問題:

如果我取消注釋self.textWebView.delegate = nil,它將正常工作。 原因是首先我們為newViewController設置了Webview,然后在ViewController1的dealloc中將其委托設置為nil。

- (void)dealloc{
    [self.testWebView stopLoading];
    if(self.testWebView.delegate == self)
        self.testWebView.delegate = nil;
    self.testWebView = nil;
}

我注意到的第一件事是在合成屬性時未指定實例變量名稱。 那只是要求碰撞。 這是一個外觀示例:

@interface ViewController1 : UIViewController <UIWebViewDelegate>
    @property (nonatomic, strong) IBOutlet UIWebView* testWebView;
@end


@implementation ViewController1

@synthesize testWebView=_testWebView;

另外,我注意到在ViewController1中您使用了IBOutlet,因此所有內容都可能在Interface Builder中進行了連接。 嘗試確保在Interface Bulider中設置了委托屬性,因為未在實現中進行設置。 這就是為什么您沒有收到任何消息的原因。

ViewController2看起來就像您在代碼中設置了委托。 問題是,您在屬性前面沒有IBOutlet 通常,這意味着您只需在代碼中設置WebView,但是在您的示例中,您永遠不會創建UIWebView控件的新實例並將其分配給self.testWebView。 這意味着如果它確實顯示在頁面上,那是因為使用了Interface Builder來創建它。 如果不在testWebView聲明的前面使用IBOutlet ,就無法在代碼中設置委托,因此這可能就是為什么它在示例2中不起作用的原因。

@interface ViewController2 : UIViewController <UIWebViewDelegate>
    @property (nonatomic, strong) UIWebView* testWebView; // Mising IBOutlet
@end

@implementation ViewController2
@synthesize testWebView;
- (void)viewDidLoad
{
    [super viewDidLoad];
    // missing any code that would create the webview [[UIWebView alloc] init]
    self.testWebView.delegate = self; // You set the delegate in code here
    [self.view addSubview:testWebView];
    [self performSelector:@selector(loadDifferentPage) withObject:nil afterDelay:10];
}

希望這會有所幫助,我將不得不看一下您的完整實現以獲取比此更具體的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM