2012-05-30 1 views
0

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는 웹보기를 유지하지만 대리자 메서드는 호출되지 않습니다. 왜?

감사 사이 내가 눈치

+0

(void) dealloc/ARC를 사용하려고합니까? – DJPlayer

+0

setTestWebView 소스는 어떤 모습입니까? – Gruntcakes

+1

@DJPlayer : 예, dealloc을 사용하고 있습니다. dealloc을 사용하는 것은 좋지만 ARC에 의해 추가되기 때문에 [super dealloc]을 호출해서는 안됩니다. – Sai

답변

3

ViewController1의 delloc 방법은 문제를 일으키는 원인이되었다. 그 이유는 먼저 newViewController에 대한 webview를 설정하고 나중에 ViewController1의 dealloc에서 delegate를 nil로 설정하기 때문입니다.

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

우선은 속성을 합성 할 때 인스턴스 변수 이름을 지정하지 않을 수 있습니다. 그것은 단지 충돌을 요구하고 있습니다. 여기에 그 모습 방법의 예

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


@implementation ViewController1 

@synthesize testWebView=_testWebView; 

은 또한, 나는 당신이 그렇게 모든 것이 아마도 인터페이스 빌더에서 연결되어 함께 IBOutlet을 사용 ViewController1에 나타났습니다. 구현에 설정하지 않았으므로 Interface Bulider에서 대리자 속성을 설정해야합니다. 그래서 당신은 어떤 메시지도받지 못합니다.

ViewController2 코드에서 대리인을 설정 한 것처럼 보입니다. 문제는, 바로 앞에 IBOutlet이 없기 때문입니다. 일반적으로 이것은 코드에서 WebView를 설정한다는 것을 의미하지만 예제에서는 UIWebView 컨트롤의 새 인스턴스를 만들어 self.testWebView에 할당하지 않습니다. 즉, 인터페이스 빌더가 페이지를 작성하는 데 사용 되었기 때문에 페이지에 표시되는 것입니다. IBOutlet을 testWebView 선언 앞에 사용하지 않고 코드에서 대리자를 설정할 수 없으므로 아마도이 예제가 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]; 
} 

희망이 내가이보다 더 구체적 얻을 수 있도록 완전한 이행을 볼 수있는 것, 할 수 있습니다. 잘 작동 전무 내가 self.textWebView.delegate =을 주석 처리를 제거하면

:

+0

예, 인터페이스 작성기에서 ViewController1 webview 대리인을 설정 중입니다. 이제 IB에 대해 걱정할 필요가 없도록 코드를 업데이트했습니다. VC1은 잘 작동합니다. VC2의 경우 iboutlet으로 testwebview를 설정할 필요가 없으며 VC1에서 webview를 가져올 때 만들어야합니다. – Sai

관련 문제