web-dev-qa-db-ja.com

iPadが動作しないActionSheet

アプリケーションでActionSheetを使用しています。私のiPhoneでは動作しますが、iPadシミュレーターでは動作しません。

これは私のコードです:

@IBAction func dialog(sender: AnyObject) {

    let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .ActionSheet)
    let deleteAction = UIAlertAction(title: "Delete", style: .Default, handler: {

        (alert: UIAlertAction!) -> Void in
        println("Filtre Deleted")
    })

    let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        println("Cancelled")
    })

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(cancelAction)

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

そして私のエラー:

キャッチされない例外 'NSGenericException'によるアプリの終了、理由: 'アプリケーションは、スタイルUIAlertControllerStyleActionSheetのUIAlertController()を提示しました。このスタイルのUIAlertControllerのmodalPresentationStyleはUIModalPresentationPopoverです。アラートコントローラーのpopoverPresentationControllerを使用して、このポップオーバーの位置情報を提供する必要があります。 sourceViewとsourceRectまたはbarButtonItemのいずれかを提供する必要があります。アラートコントローラーを提示するときにこの情報が不明な場合は、UIPopoverPresentationControllerDelegateメソッド-prepareForPopoverPresentationで提供できます。

78
Stephany

IPadではそのUIPopoverPresentationControllerであるため、optionMenuを表示する直前にソースビューまたはボタンを提供する必要があります。これは、アクションシートがボタンを指し示していることを意味し、ユーザーにボタンの開始点を知らせます。

たとえば、右側のナビゲーションバー項目をタップしてoptionMenuを表示する場合。次のようなことができます:

optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

self.presentViewController(optionMenu, animated: true, completion: nil)

または、次のようにビューを設定できます:(これらの2つのうちの1つが必要です)

optionMenu.popoverPresentationController?.sourceView = yourView

self.presentViewController(optionMenu, animated: true, completion: nil)

また、UIAlertControllerStyleをアクションシートではなくアラートに変更する場合、これを指定する必要はないことに注意してください。あなたはそれを理解したに違いないと確信していますが、私はこのページに出くわした人を助けたかっただけです。

104
MD Singh

私にとっても同じ問題。電話では正常に機能するが、iPadではクラッシュするUIAlertControllerがありました。テーブルビューからセルをタップすると、シートがポップアップします。

Swift 3の場合、表示する直前に3行のコードを追加しました。

        ...

        sheet.popoverPresentationController?.sourceView = self.view
        sheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection()
        sheet.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)


        self.present(sheet, animated: true, completion: nil)
25
Zach

Swift

前述したように、UIAlertControllerを構成してiPADの特定のポイントに表示する必要があります。

ナビゲーションバーの例:

    // 1
    let optionMenu = UIAlertController(title: nil, message: "Choose an option", preferredStyle: .actionSheet)

    // 2
    let deleteAction = UIAlertAction(title: "Option 1", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 1 pressed")
    })
    let saveAction = UIAlertAction(title: "Option 2", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 2 pressed")
    })

    //
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        print("Cancelled")
    })


    // 4

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(saveAction)
    optionMenu.addAction(cancelAction)

    // 5

    optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

    self.present(optionMenu, animated: true) { 
        print("option menu presented")
    }
23
mourodrigo

提示する前に以下の用語でステートメントを追加します。

optionMenu.popoverPresentationController.sourceView = self.view;
optionMenu.popoverPresentationController.sourceRect = 

CGRectMake(0,0,1.0,1.0);


@IBAction func dialog(sender: AnyObject) {
    ...

    optionMenu.popoverPresentationController.sourceView = self.view;
    optionMenu.popoverPresentationController.sourceRect = CGRectMake(0,0,1.0,1.0);

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

それはうまくいくでしょう。

4
Jimmy chou

矢印なしで中央に表示したい場合[Swift 3 +]:

if let popoverController = optionMenu.popoverPresentationController {
        popoverController.sourceView = self.view
        popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
        popoverController.permittedArrowDirections = []
    }
self.present(optionMenu, animated: true, completion: nil)
3
Mohit Singh

IBのソースビューをアプリの関連変数にリンクしていない場合にもこのエラーが発生する可能性があることに注意してください。

0
Peter Johnson