Swift 2では、iPhoneやiPadで適切に表示するために、次のようなことをしたいとします。
func confirmAndDelete(sender: AnyObject) {
guard let button = sender as? UIView else {
return
}
let alert = UIAlertController(title: NSLocalizedString("Delete Contact?", comment: ""), message: NSLocalizedString("This action will delete all downloaded audio files.", comment: ""), preferredStyle: .ActionSheet)
alert.modalPresentationStyle = .Popover
let action = UIAlertAction(title: NSLocalizedString("Delete", comment: ""), style: .Destructive) { action in
EarPlaySDK.deleteAllResources()
}
let cancel = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .Cancel) { action in
}
alert.addAction(cancel)
alert.addAction(action)
if let presenter = alert.popoverPresentationController {
presenter.sourceView = button
presenter.sourceRect = button.bounds
}
presentViewController(alert, animated: true, completion: nil)
}
プレゼンターを設定しないと、iPadで例外が発生-[UIPopoverPresentationController presentationTransitionWillBegin]
し、次のメッセージが表示されます。
致命的な例外:NSGenericExceptionアプリケーションが、UIAlertControllerStyleActionSheetスタイルのUIAlertController(<UIAlertController:0x17858a00>)を提示しました。このスタイルのUIAlertControllerのmodalPresentationStyleは、UIModalPresentationPopoverです。警告コントローラーのpopoverPresentationControllerを介して、このポップオーバーの位置情報を提供する必要があります。sourceViewとsourceRect、またはbarButtonItemのいずれかを提供する必要があります。アラートコントローラを提示するときにこの情報がわからない場合は、UIPopoverPresentationControllerDelegateメソッド-prepareForPopoverPresentationで提供できます。