5

iOS8(xcode 6ベータ5)でUIAlertcontrollerを使用して提示しているアクションシートがあります。UIAlertcontroller を使用しているのは、UIActionsheet (iOS 8 で非推奨) が ios8 で適切に機能していなかったためです。アクションシートの任意のオプションをクリックすると、親ビューに戻りました。UIAlertcontroller でも 1 つの問題に直面しています。アクション シートのポップオーバーの外側をダブルタップすると、前の親ビューに戻ります。以下は私のコードスニペットです:

UIAlertController *actionSheetIos8;

actionSheetIos8 = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];

NSArray *buttonsArray = [self returnMoreArray];
int startY = 10;
for (int i = 0; i < [buttonsArray count]; i++) {

    UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:[buttonsArray objectAtIndex:i] style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        NSString *newStr = [buttonsArray objectAtIndex:i];
        newStr = [[newStr lowercaseString] stringByReplacingOccurrencesOfString:@" " withString:@"_"];
    }];
    [actionSheetIos8 addAction:defaultAction];        
}
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
}];

[actionSheetIos8 setModalPresentationStyle:UIModalPresentationPopover];
UIPopoverPresentationController *popPresenter = [actionSheetIos8
                                                 popoverPresentationController];
popPresenter.sourceView = sender;
popPresenter.sourceRect = [sender frame];
dispatch_async(dispatch_get_main_queue(), ^ {
    [self presentViewController:actionSheetIos8 animated:YES completion:nil];
});
4

1 に答える 1

13

次の解決策は、ポップオーバー プレゼンテーション コントローラーのシナリオでうまくいきました。同じバグがあなたの状況の根底にあると思われます:

  1. にデリゲート (UIPopoverPresentationControllerDelegateプロトコルに準拠) を設定しますUIPopoverPresentationController
  2. デリゲート メソッドを実装しpopoverPresentationControllerShouldDismissPopover:ます。

例えば:

/**
 The presence of this delegate callback inhibits the popover presentation controller
 from mistakenly calling 'dismissViewControllerAnimated:completion:' on us twice.
 */
- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController;
{
    NSLog(@"delegate method called asking permission to dismiss popover");
    return YES;
}

提示されたコントローラーとデリゲートを使用してポップオーバー プレゼンテーション コントローラーを設定しているコンテキストを次に示します。

// Set modal presentation style and issue the presentViewController:animated:completion:
// call before retrieving popover presentation controller created for us, as suggested
// in the API documentation that is more recent than the sample code from the
// WWDC2014 slides in Session 228:
presentedController.modalPresentationStyle = UIModalPresentationPopover;
[self presentViewController:presentedController animated:YES completion:nil];

// Now we can retrieve the popover presentation controller and configure it:
UIPopoverPresentationController *popPC = presentedController.popoverPresentationController;
popPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
CGRect popoverRect = cell.infoButton.bounds; // Assume 'cell' exists; it's an object of mine with an 'infoButton' view.
popPC.sourceView = cell.infoButton; // has to be provided along with sourceRect
popPC.sourceRect = popoverRect;  // has to be provided along with sourceView
popPC.delegate = self; // or whomever you set to be your popover presentation controller delegate.
于 2014-09-28T14:01:55.783 に答える