0

この質問は、iPad の webview/textview で電話番号またはメールが選択されたときに、アクションシートとポップオーバーを表示する iOS のネイティブ機能に関するものです。復習が必要な場合に備えて、アクションシートには「連絡先に追加」と「コピー」という 2 つのボタンがあります。私が参照しているポップオーバーは、ユーザーが [連絡先に追加] ボタンを選択したときに表示されるものです。

ポップオーバーを閉じるには、次のように宣言することを理解しています。

[somePopoverController dismissPopoverAnimated:YES];

アクションシートを閉じるには、次のように呼び出すだけです。

[someActionSheet dismissWithClickedButtonIndex:0 animated:YES];

ただし、私の問題は、iOS がこれらのアクションシート/ポップオーバーを作成したため、それらを所有しておらず、それらを参照して却下メソッドを呼び出すことができないことです。

なぜこれを行う必要があるのか​​というユースケースは、指定された時間アクティビティがないとアプリケーションがユーザーをログアウトさせるためです。ユーザーがログアウトすると、新しいView Controllerを入力して古いものを削除しても、これらのアクションシート/ポップオーバーは画面に残ります。

私が所有していないこれらのポップオーバーとアクションシートを参照する方法を知っている人はいますか? どんなアドバイスでも大歓迎です!

4

2 に答える 2

1

iPadで電話番号/メールを検出するときに、UIActionSheetsとWebviews/Textviewsから作成されるポップオーバーの両方を閉じる解決策を見つけました。解決策は、基本的に、却下したいビューが見つかるまで、再帰を使用してすべてのビューを反復処理することです。この投稿Accessing UIPopoverController for UIActionSheet on iPad で見つけた回答には、多くの功績が認められます。

UIActionSheets を削除するには:

BOOL IsActionOpen(UIView* aView) {
    BOOL    actionOpen = NO;
    if (aView) {
        if ([aView isKindOfClass:[UIActionSheet class]]) {
            actionOpen = YES;
            [(UIActionSheet *)aView dismissWithClickedButtonIndex:0 animated:NO];
        }
        else if (aView.subviews.count > 0) {
            for (UIView* aSubview in aView.subviews) {
                if ( IsActionOpen( aSubview)) {
                    if ([aView isKindOfClass:[UIActionSheet class]]) {
                        actionOpen = YES;
                        [(UIActionSheet *)aView dismissWithClickedButtonIndex:0 animated:NO];
                    }break;
                }
            }
        }
    }
    return actionOpen;
}

- (void) removeActionSheetIfShowing {
    BOOL    actionOpen = NO;
    for (UIWindow* w in [UIApplication sharedApplication].windows) {
        actionOpen =  IsActionOpen(w);
        if (actionOpen)
            break;
    }
}

生成された UIActionSheet から [連絡先に追加] ボタンを選択したときに作成されるポップオーバーを削除するには:

BOOL IsPopOverOpen(UIView* aView) {
    BOOL    popOverOpen = NO;
    if (aView) {
        //popover is a popoverview, not a popovercontroller. We find it by checking if UIPopoverBackgroundView exists
        if([aView isKindOfClass:[UIPopoverBackgroundView class]]){
            popOverOpen = YES;
            [aView.superview removeFromSuperview];
        }
        else if (aView.subviews.count > 0) {
            for (UIView* aSubview in aView.subviews) {
                if ( IsPopOverOpen( aSubview)) {
                    if([aView isKindOfClass:[UIPopoverBackgroundView class]]){
                        popOverOpen = YES;
                        [aView.superview removeFromSuperview];
                    }break;
                }
            }
        }
    }
    return popOverOpen;
}

- (void) removePopOverIfShowing {
    BOOL    popOverOpen = NO;
    for (UIWindow* w in [UIApplication sharedApplication].windows) {
        popOverOpen =  IsPopOverOpen(w);
        if (popOverOpen)
            break;
    }
}
于 2013-10-02T16:32:52.300 に答える
0

必要なのは、View Controller でそれらへの参照を保持することだけです。UIActionSheetたとえば、を作成するときは、タイプのプロパティに保存するだけですUIActionSheet

@property (strong, nonatomic) UIActionSheet *myActionSheet;

次に、実際にアクションシートを作成するときに、

self.myActionSheet = [[UIActionSheet alloc] initWithTitle:myTitle 
                                                 delegate:self 
                                        cancelButtonTitle:cancelButtonTitle 
                                   destructiveButtonTitle:destButtonTitle 
                                        otherButtonTitles:otherButtonTitle, nil];

[self.myActionSheet showFromBarButtonItem:sender animated:YES];

そして、それを却下する必要があるときは、単にそうするだけです

[self.myActionSheet dismissWithClickedButtonIndex:0 animated:YES];
于 2013-09-30T15:45:25.320 に答える