1

アプリで少し問題が発生しました。単純な問題ですが、クラッシュの原因がわかりません。

Webビュー(ストーリーボードで作成およびリンクされている)のみを備えた単純なビューコントローラーがあります(ARCが有効):

@implementation BPActivateController
@synthesize mainWebView;

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {

    }
    return self;
}

- (void)viewDidLoad
{
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/test.php?code=%@", BASE_URL, [[NSUserDefaults standardUserDefaults] objectForKey:@"uniqueIdentifier"]]]; 
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [mainWebView loadRequest:requestObj];

    [super viewDidLoad];
}


- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
    if ([html rangeOfString:@"<h1>Not Found</h1>"].location != NSNotFound)
    {
        [self.navigationController popViewControllerAnimated:YES];
        NSLog(@"pop the view controller");
    }
}

- (void)viewDidUnload
{
    [self setMainWebView:nil];
    [super viewDidUnload];
}

ビューが最初に開いたときにpopViewControllerAnimatedが呼び出され、ユーザーは最後のビューコントローラーにリダイレクトされます。ただし、ビューを再度開くと、popViewControllerAnimatedが呼び出された後にEXEC_BAD_ACCESSが返されます。ゾンビコードを有効にすると、次のトレースが表示されます。

2012-06-04 11:51:12.717 actusmedicus[410:707] pop the view controller
2012-06-04 11:51:12.720 actusmedicus[410:707] *** -[BPActivateController respondsToSelector:]: message sent to deallocated instance 0xc6d95b0

私はいくつかのことを試しましたが、それでもセレクターが何と呼ばれているのかはっきりしていません。Webビューはまだビジーだと思います。

誰かが私を軌道に戻すアイデアを持っていますか?


[編集]

EXEC_BAD_ACCESSは、Webビューのデリゲートをnilに設定することで修正されます。しかし、本当の問題はまだあります。ビューがUINavigationスタックに初めてプッシュされると、Webビューが読み込まれ、404の後にpopViewControllerAnimatedが正常に実行されます。しかし、2回目に同じビューをUINavigationスタックにプッシュするとき(最初に行ったのと同じ方法)、popViewControllerAnimatedは何もしません。ゼロかどうかを確認しましたが、問題ないようです。

私の最初のアイデアは、それが別のスレッドで実行され、UINavigationcontrollerがそこに存在しないということでした。私はperformSelectorOnMainThreadの助けを借りてその可能性を排除しました。

最後に、popViewControllerAnimatedを手動で呼び出すボタンを追加しました。これは毎回機能しますが、プログラムで呼び出すと機能しないのはなぜですか?

4

2 に答える 2

0

Webビューはまだビジーだと思います。

その場合は、deallocでstopLoadingメソッドを呼び出します。

また、deallocでデリゲートをnilに設定する必要があります。

于 2012-06-05T00:51:28.313 に答える
0

宛先のViewControllerに2回セグエしていないことを確認してください。私の場合、私のコードはセグエを2回起動しました。そのため、メインコントローラーに戻るには、戻るボタンを2回クリックする必要がありました。

于 2013-07-06T13:36:34.750 に答える