0

ARC に問題があります。Webビューを保持していません。シナリオは、あるビューコントローラーから別のビューコントローラーに webview を送信する必要があることです。その理由は、ユーザーが何かを検索するときに、他のオプションを備えた新しい画面に移動したいからです。(同じWebビューを使用する必要があります)

サンプルコードは次のとおりです。Webビューを持つViewController1があります(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;
}

2 番目のビュー コントローラーでは、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 を保持していますが、デリゲート メソッドは呼び出されていません。なんで?

ありがとうサイ

4

2 に答える 2

3

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;
}
于 2012-10-05T19:10:35.253 に答える
0

最初に気付いたのは、プロパティを合成するときにインスタンス変数名を指定していないことです。それは衝突を求めているだけです。これがどのように見えるかの例を次に示します。

@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];
}

これが役立つことを願っています。これよりも具体的にするには、完全な実装を確認する必要があります。

于 2012-05-31T02:47:46.537 に答える