1

私はUIWebViewを使用していますが、ボタンがクリックされると(javascriptから)アラートが表示されます。コントローラーを閉じる別のボタン (ネイティブ側) があるため、UIWebView の割り当ても解除します。

問題は、UIWebView のボタンをタッチして、アラートが生成される前にタッチしてボタンを閉じると、コントローラーと UIWebView の割り当てが解除されますが、アラートが画面に残ります。次に、アラートで任意のボタンをクリックすると、アプリケーションがクラッシュし、次のエラーが発生します。

[UIWebView modalView:didDismissWithButtonIndex:]: message sent to deallocated instance

そして、このメソッドはプライベートメソッドから呼び出されます

[UIModalView(Private) _popoutAnimationDidStop:finished:]

私は ARC を使用しており、私の割り当て解除は次のようになります。

- (void)dealloc {
    [_myWebView stopLoading];
    _myWebView.delegate = nil;
    _myWebView = nil;
}

しかし、これは私の問題を解決しません。なぜなら、UIModalView には私の webview をデリゲートとして参照していると思うからです。それは非公開であるため、nil に設定できませんでした。

どうすれば解決できますか?

よろしく

4

3 に答える 3

1

これは、アラート ビューの処理における Apple のバグです。バグ レポートを開きます。

それまでの間、いくつかの回避策を次に示します。

UIAlertView でカテゴリを作成します。

@interface UIAlertView (QuickDismiss) @end

@implementation UIAlertView (QuickDismiss)


- (void)__quickDismiss
{
     [self dismissWithClickedButtonIndex:self.cancelButtonIndex animated:NO];
}

@end

次に、View Controller の dealloc メソッドで、次のように呼び出します。

[[UIApplication sharedApplication] sendAction:@selector(__quickDismiss) to:nil from:nil forEvent:nil];

これにより、Web ビューで表示されているアラート ビューを含め、現在開いているすべてのアラート ビューが閉じられます。

それがうまくいかない場合は、いつでもすべてのオブジェクトのすべてのサブビューを反復し、真UIApplication.sharedApplication.windowsかどうかを確認してそれを却下することができます。[view.class.description hasPrefix:@"UIAlertView"]これは前の方法よりも洗練されていないため、最後の手段にする必要があります。

幸運を。

于 2013-08-24T16:01:26.630 に答える
1

UIWebView の割り当てを解除する前に、UIAlertView のデリゲートを nil に設定する方法を見つけてください。

于 2013-04-09T11:34:39.363 に答える