アプリケーションで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で提供できます。
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をアクションシートではなくアラートに変更する場合、これを指定する必要はないことに注意してください。あなたはそれを理解したに違いないと確信していますが、私はこのページに出くわした人を助けたかっただけです。
私にとっても同じ問題。電話では正常に機能するが、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)
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")
}
提示する前に以下の用語でステートメントを追加します。
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)
}
それはうまくいくでしょう。
矢印なしで中央に表示したい場合[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)
IBのソースビューをアプリの関連変数にリンクしていない場合にもこのエラーが発生する可能性があることに注意してください。