[英]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.