ios - objective - xcode アクション シート




それを参照せずにUIAlertViewを見つけますiOS 7 (4)

iOS 7ソリューション

Class UIAlertManager = objc_getClass("_UIAlertManager");
UIAlertView *topMostAlert = [UIAlertManager performSelector:@selector(topMostAlert)];

AppStoreで承認可能かどうかはわかりませんが、動作します

UPD単一行コード:

UIAlertView *topMostAlert = [NSClassFromString(@"_UIAlertManager") performSelector:@selector(topMostAlert)];

私はここで答えた私のプロジェクトでコードスニペットを使用していました: それを参照せずにUIAlertView

これがコードです:

+ (UIAlertView *) getUIAlertViewIfShown {
    if ([[[UIApplication sharedApplication] windows] count] == 1) {
        return nil;
    }

    UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    if ([window.subviews count] > 0) {
        UIView *view = [window.subviews objectAtIndex:0];
        if ([view isKindOfClass:[UIAlertView class]]) {
            return (UIAlertView *) view;
        }
    }
    return nil;
}

残念ながら、iOS 7では機能していません。アラートビューを閉じることはできません。 デバッグ中、ループ内でそのビューの表示がUITransitionViewクラスであることがUITransitionView 。 このビュークラスの簡単なドキュメントが見つからなかったため、かなり混乱しています。

どのようにすればこの問題を解決できますか。


iOS7では、 UIAlertViewウィンドウは-[UIApplication windows]は表示されません。 実際、 UIAlertView自体はどのウィンドウにも追加されません。 -[UIAlertView window]は常にnilです。 代わりに、アラートビューは-[UIApplication keyWindow]配置されたドキュメントに記載されていないさまざまなビューを管理します。アラートビューは参照されません。

iOS 7で唯一の現実的な選択肢は、実際にアラートビューを追跡することです。


私は似たような問題に直面しており、私の場合はUIAlertViewウィンドウはUIAlertView [UIApplication windows]には表示されないとBrianが既に述べているように、警告はView Controllerの異なるインスタンスから表示されます。

だから、この次のアプローチを追跡するために従うことができます -

  1. App DelegateでBOOL定数を定義します -

    @property (nonatomic, assign) BOOL isAlertVisibleOnAppWindow;
  2. 'UIAlerView`が存在する場合は、以前のインスタンスの存在を確認してください -

    AppDelegate *delegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
    if (!delegate.isAlertVisibleOnAppWindow) {
        delegate.isAlertVisibleOnAppWindow = YES;
    
        UIAlertView *alertView = [[UIAlertView alloc] init//alert init code
    
        // Either handle alert cancel/completeion click here via blocks, or use alert delegates to reset the isAlertVisibleOnAppWindow BOOL variable to NO.
    }

これを共有することを考えて、これは他の何人かの人々に役立つかもしれません。


UIAlertView *topMostAlert = [NSClassFromString(@"_UIAlertManager") performSelector:@selector(topMostAlert)];

これはApple Storeへの公開を許可されません。 ビルド検証中に、Xcodeは次のようなエラーをスローします。「文書化されていないメソッドへのアクセス..」したがって、使用することはできませんが、このコードはうまく機能します。





ios7