ARC에 문제가 있습니다. 그것은 webview를 유지하지 않습니다. 시나리오는 하나의 viewcontroller에서 다른 뷰로 webview를 보내야합니다. 그 이유는 사용자가 다른 옵션을 사용하여 그를 새로운 화면으로 가져 가고자하는 것을 검색 할 때입니다. (동일한 webview를 사용해야합니다.)목표 C - iOS - ARC에 유지되는 UIWebView가 있지만 대리자 메서드가 호출되지 않습니다.
다음은 샘플 코드입니다. webview가있는 ViewController1이 있습니다. (xib에 추가했습니다.)로드 중이며 사용자가 무언가를 검색하면 로드가 완료되면 새로운 뷰 컨트롤러로 옮기고 새로운 뷰 컨트롤러에서 동일한 웹 뷰를 표시해야합니다.
//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는 웹보기를 유지하지만 대리자 메서드는 호출되지 않습니다. 왜?
감사 사이 내가 눈치
(void) dealloc/ARC를 사용하려고합니까? – DJPlayer
setTestWebView 소스는 어떤 모습입니까? – Gruntcakes
@DJPlayer : 예, dealloc을 사용하고 있습니다. dealloc을 사용하는 것은 좋지만 ARC에 의해 추가되기 때문에 [super dealloc]을 호출해서는 안됩니다. – Sai