質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

2606閲覧

iPadでのUIAlertControllerの使用について

Meteor

総合スコア18

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/07/16 12:07

###前提・実現したいこと
iPad pro でactionsheetをタップするとクラッシュする件について
今、「世界一受けたいiPhoneアプリ開発の授業」の最新版を読んでいます。実機のiPadでシュミレートした結果、アクションシートは使えず、代わりにpopoverPresentationControllerを使うということまで見つけました。が、なかなか思うように表示されません。

書籍のコードを引用するので、iPadで稼働できるよう修正いただけると幸いです。
■■な機能を実装中に以下のエラーメッセージが発生しました。

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード
//アクションシート表示メソッド
@IBAction func cameraTapped() {
//UIImagePickerControllerを使うための定数
let pickerController = UIImagePickerController()
//UIImagePickerControllerのデリゲートメソッドを使用する設定
pickerController.delegate = self
//UIAcionSheetを使うための定数を作成
let sheet = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
//ボタンタイトルをNSLocalizedStringに変更
let cancelString = NSLocalizedString("Cancel", comment: "キャンセル")
let cameraString = NSLocalizedString("Camera", comment: "カメラ")
let libraryString = NSLocalizedString("Library", comment: "ライブラリ")
//3つのアクションボタンの定数を作成
let cancelAction = UIAlertAction(title: cancelString, style: .Cancel, handler: {(action) -> Void in})
let cameraAction = UIAlertAction(title: cameraString, style: .Default, handler: {(action) -> Void in
pickerController.sourceType = .Camera
self.presentViewController(pickerController, animated: true, completion: nil)})
let LibraryAction = UIAlertAction(title: libraryString, style: .Default, handler: {(action) -> Void in
pickerController.sourceType = .PhotoLibrary
self.presentViewController(pickerController, animated: true, completion: nil)})
//アクションシートにアクションボタンを追加
sheet.addAction(cancelAction)
sheet.addAction(cameraAction)
sheet.addAction(LibraryAction)
//アクションシートを表示

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

###試したこと
引数にsender: AnyObject を追加して以下を見つけて書き込んでみました。

sheet.popoverPresentationController?.sourceView = view sheet.popoverPresentationController?.sourceRect = sender.frame

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

iPadでUIAlertControllerのActionSheetが落ちる問題

上記のサイトを参考にしてiPad Pro(シュミレーター)ActionSheetを表示するところまで確認しました。

swift

1import UIKit 2 3class ViewController: UIViewController , UIImagePickerControllerDelegate, UINavigationControllerDelegate { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 } 9 10 // UIBarButtonItemを押下時 11 @IBAction func pushItem(sender: UIBarButtonItem) { 12 13 //UIImagePickerControllerを使うための定数 14 let pickerController = UIImagePickerController() 15 //UIImagePickerControllerのデリゲートメソッドを使用する設定 16 pickerController.delegate = self 17 //UIAcionSheetを使うための定数を作成 18 let sheet = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet) 19 20 //ボタンタイトルをNSLocalizedStringに変更 21 let cancelString = NSLocalizedString("Cancel", comment: "キャンセル") 22 let cameraString = NSLocalizedString("Camera", comment: "カメラ") 23 let libraryString = NSLocalizedString("Library", comment: "ライブラリ") 24 //3つのアクションボタンの定数を作成 25 let cancelAction = UIAlertAction(title: cancelString, style: .Default, handler: {(action) -> Void in}) 26 let cameraAction = UIAlertAction(title: cameraString, style: .Default, handler: {(action) -> Void in 27 pickerController.sourceType = .Camera 28 self.presentViewController(pickerController, animated: true, completion: nil)}) 29 let LibraryAction = UIAlertAction(title: libraryString, style: .Default, handler: {(action) -> Void in 30 pickerController.sourceType = .PhotoLibrary 31 self.presentViewController(pickerController, animated: true, completion: nil)}) 32 33 34 //アクションシートにアクションボタンを追加 35 sheet.addAction(cancelAction) 36 sheet.addAction(cameraAction) 37 sheet.addAction(LibraryAction) 38 39 //アクションシートを表示 40 sheet.popoverPresentationController?.sourceView = view 41 sheet.popoverPresentationController?.barButtonItem = sender 42 43 self.presentViewController(sheet, animated: true, completion: nil) 44 } 45 46 // UIButtonを押下時 47 @IBAction func cameraTapped(sender: UIButton) { 48 49 //UIImagePickerControllerを使うための定数 50 let pickerController = UIImagePickerController() 51 //UIImagePickerControllerのデリゲートメソッドを使用する設定 52 pickerController.delegate = self 53 //UIAcionSheetを使うための定数を作成 54 let sheet = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet) 55 //ボタンタイトルをNSLocalizedStringに変更 56 let cancelString = NSLocalizedString("Cancel", comment: "キャンセル") 57 let cameraString = NSLocalizedString("Camera", comment: "カメラ") 58 let libraryString = NSLocalizedString("Library", comment: "ライブラリ") 59 //3つのアクションボタンの定数を作成 60 let cancelAction = UIAlertAction(title: cancelString, style: .Default, handler: {(action) -> Void in}) 61 let cameraAction = UIAlertAction(title: cameraString, style: .Default, handler: {(action) -> Void in 62 pickerController.sourceType = .Camera 63 self.presentViewController(pickerController, animated: true, completion: nil)}) 64 let LibraryAction = UIAlertAction(title: libraryString, style: .Default, handler: {(action) -> Void in 65 pickerController.sourceType = .PhotoLibrary 66 self.presentViewController(pickerController, animated: true, completion: nil)}) 67 68 69 //アクションシートにアクションボタンを追加 70 sheet.addAction(cancelAction) 71 sheet.addAction(cameraAction) 72 sheet.addAction(LibraryAction) 73 74 //アクションシートを表示 75 sheet.popoverPresentationController?.sourceView = view 76 sheet.popoverPresentationController?.sourceRect = sender.frame 77 78 self.presentViewController(sheet, animated: true, completion: nil) 79 80 } 81}

ボタンのIBActionを結ぶときは以下のようにArgumentsSenderに設定してみてください。

i

UIBarbuttonItemargumentsを設定することで引数にUIBarbuttonItem自身のオブジェクトが渡されてきます。(UIButtonの場合も同じ)
そのオブジェクトに対してアクションシートの位置を設定したりしたり、Buttonのtagで処理を分けたりします。
@IBAction fund メソッド名(sender: UIBarButtonItem)

swift

1@IBAction fund メソッド名(sender: UIButton) { 2 if sender.tag == 1 { 3 // Buttonのtagが1の場合の処理 4 } else if sender.tag == 2 { 5 // Buttonのtagが2の場合の処理 6 } 7}

投稿2016/07/16 13:29

編集2016/07/17 07:36
_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Meteor

2016/07/17 00:51

貴重なお時間の中、ご回答くださりありがとうございます。 上記の方法で通常の「Button」では成功しました。 しかし、今回配置したのが「Bar Button Item」でして、これのArgumentsの設定はどうすれば良いのでしょうか? また、Arguments設定は何を意味しているのか教えていただけると幸いです。 何卒お願い申し上げます。
_Kentarou

2016/07/17 05:15

回答に追記しました。
Meteor

2016/07/17 07:13

また、ご回答くださりありがとうございました。ご丁寧に解説まで感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問