teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

図とコードを入れるためコメント欄に代わって回答欄に返信

2017/06/04 20:54

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -1,3 +1,192 @@
1
1
  アクションは実際には通常のメソッドと同じもので、何か動作をさせるには`{}`内に処理を記述しなければなりません。
2
2
  ボタンを押したときに実行したいのは`onClick`でしょうか?それでしたら、その内容を`ButtonCamera`内に移す必要があるかと思います。
3
- あるいは、`onClick`の頭に`@IBAction`を付けて、`ButtonCamera`の代わりにこちらをボタンと接続してもいいかもしれません。
3
+ あるいは、`onClick`の頭に`@IBAction`を付けて、`ButtonCamera`の代わりにこちらをボタンと接続してもいいかもしれません。
4
+
5
+ [コメントに関して追記]
6
+ 「中身を移す」の申し上げたのは`func onClick(sender:UIButton){`と`}`で挟まれた部分を`@IBAction func ButtonCamera(_ sender: Any) {`と`}`で挟まれた部分に移動するということを意図しました。
7
+ さらに、ButtonCameraの中でsenderのtagを見て分岐していますので、tagを見ることができるようsenderの型をAnyからUIButtonにしてみました。
8
+ このアクションを、ButtonCameraとButtomReadに対応する2つのボタンに繋いでみてください(ButtonCameraとButtomReadのどちらを押しても同じアクションが実行されるようにする)。
9
+
10
+ ```Swift
11
+ import UIKit
12
+
13
+ class SendController:UIViewController,
14
+ UINavigationControllerDelegate,UIImagePickerControllerDelegate{
15
+
16
+ //このアクションとボタンを繋ぐ
17
+ @IBAction func ButtonCamera(_ sender: UIButton) { // senderの型をUIButtonに変更
18
+ if sender.tag == ButtonCamera {
19
+ showAlert(title: nil, text: "利用できません")
20
+ openPicker(sourceType: UIImagePickerControllerSourceType.camera)
21
+
22
+ }else if sender.tag == ButtomRead {
23
+ openPicker(sourceType: UIImagePickerControllerSourceType.photoLibrary)
24
+ }
25
+ }
26
+
27
+ //定数
28
+ let ButtonCamera = 0
29
+ let ButtomRead = 1
30
+ let ButtonWrite = 2
31
+
32
+
33
+ //変数
34
+ var imageView:UIImageView = UIImageView()
35
+ var btnCamera:UIButton = UIButton(type: .custom)
36
+ var btnRead:UIButton = UIButton(type: .custom)
37
+ var btnWrite:UIButton = UIButton(type: .custom)
38
+
39
+ //ロード完了時に呼ばれる
40
+ override func viewDidLoad() {
41
+ super.viewDidLoad()
42
+ }
43
+
44
+ //ボタンクリック時に呼ばれる
45
+ //以下のメソッドの中身をButtonCameraに移動
46
+ /*
47
+ func onClick(sender:UIButton){
48
+ if sender.tag == ButtonCamera {
49
+ showAlert(title: nil, text: "利用できません")
50
+ openPicker(sourceType: UIImagePickerControllerSourceType.camera)
51
+
52
+
53
+ }else if sender.tag == ButtomRead {
54
+ openPicker(sourceType: UIImagePickerControllerSourceType.photoLibrary)
55
+ }
56
+
57
+ }
58
+ */
59
+
60
+ //アラートの表示
61
+ func showAlert(title: String?, text: String?) {
62
+ let alert = UIAlertController(title: title, message: text, preferredStyle: UIAlertControllerStyle.alert)
63
+ alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
64
+ present(alert, animated: true, completion: nil)
65
+ }
66
+
67
+ //イメージピッカーのオープン
68
+ func openPicker(sourceType:UIImagePickerControllerSourceType){
69
+ if !UIImagePickerController.isSourceTypeAvailable(sourceType){
70
+ showAlert(title: nil, text: "利用できません")
71
+ return
72
+ }
73
+
74
+ //イメージピッカーの生成
75
+ let picker = UIImagePickerController()
76
+ picker.sourceType = sourceType
77
+ picker.delegate = self
78
+
79
+ //ビューコントローラーのビューを開く
80
+ present(picker, animated: true, completion: nil)
81
+ }
82
+
83
+ // // イメージピッカーのイメージ取得時に呼ばれる
84
+ func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
85
+ let image = info[UIImagePickerControllerOriginalImage]as! UIImage
86
+ imageView.image = image
87
+ //ビューコントローラーのビューを閉じる
88
+ picker.presentingViewController?.dismiss(animated: true,completion:nil)
89
+ }
90
+
91
+ // //イメージピッカーのキャンセル取得時に呼ばれる
92
+ func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
93
+ picker.presentingViewController?.dismiss(animated: true, completion: nil)
94
+ }
95
+
96
+
97
+ }
98
+ ```
99
+
100
+ onClickをアクションに変えるパターンはこのような感じです。
101
+
102
+ ```Swift
103
+ import UIKit
104
+
105
+ class SendController:UIViewController,
106
+ UINavigationControllerDelegate,UIImagePickerControllerDelegate{
107
+
108
+ //これは削除
109
+ /*
110
+ @IBAction func ButtonCamera(_ sender: Any) {
111
+ }
112
+ */
113
+
114
+ //定数
115
+ let ButtonCamera = 0
116
+ let ButtomRead = 1
117
+ let ButtonWrite = 2
118
+
119
+
120
+ //変数
121
+ var imageView:UIImageView = UIImageView()
122
+ var btnCamera:UIButton = UIButton(type: .custom)
123
+ var btnRead:UIButton = UIButton(type: .custom)
124
+ var btnWrite:UIButton = UIButton(type: .custom)
125
+
126
+ //ロード完了時に呼ばれる
127
+ override func viewDidLoad() {
128
+ super.viewDidLoad()
129
+ }
130
+
131
+ //ボタンクリック時に呼ばれる
132
+ @IBAction func onClick(sender:UIButton){ // @IBActionを追加
133
+ if sender.tag == ButtonCamera {
134
+ showAlert(title: nil, text: "利用できません")
135
+ openPicker(sourceType: UIImagePickerControllerSourceType.camera)
136
+
137
+
138
+ }else if sender.tag == ButtomRead {
139
+ openPicker(sourceType: UIImagePickerControllerSourceType.photoLibrary)
140
+ }
141
+
142
+ }
143
+
144
+ //アラートの表示
145
+ func showAlert(title: String?, text: String?) {
146
+ let alert = UIAlertController(title: title, message: text, preferredStyle: UIAlertControllerStyle.alert)
147
+ alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
148
+ present(alert, animated: true, completion: nil)
149
+ }
150
+
151
+ //イメージピッカーのオープン
152
+ func openPicker(sourceType:UIImagePickerControllerSourceType){
153
+ if !UIImagePickerController.isSourceTypeAvailable(sourceType){
154
+ showAlert(title: nil, text: "利用できません")
155
+ return
156
+ }
157
+
158
+ //イメージピッカーの生成
159
+ let picker = UIImagePickerController()
160
+ picker.sourceType = sourceType
161
+ picker.delegate = self
162
+
163
+ //ビューコントローラーのビューを開く
164
+ present(picker, animated: true, completion: nil)
165
+ }
166
+
167
+ // // イメージピッカーのイメージ取得時に呼ばれる
168
+ func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
169
+ let image = info[UIImagePickerControllerOriginalImage]as! UIImage
170
+ imageView.image = image
171
+ //ビューコントローラーのビューを閉じる
172
+ picker.presentingViewController?.dismiss(animated: true,completion:nil)
173
+ }
174
+
175
+ // //イメージピッカーのキャンセル取得時に呼ばれる
176
+ func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
177
+ picker.presentingViewController?.dismiss(animated: true, completion: nil)
178
+ }
179
+
180
+
181
+ }
182
+ ```
183
+
184
+ こちらも同じく、ButtonCameraとButtomReadの両方のボタンに接続してみてください。
185
+
186
+ ![接続図](6defb01e779ee9e442fca1430bab76d9.png)
187
+
188
+ 注意点として、ストーリーボード上のButtonCameraボタンが削除したアクションButtonCameraに繋がったままだと、ボタンを押した時にonClickとButtonCameraの両方のアクションを実行しようとしてクラッシュすると思いますので、コネクションインスペクタで古いアクションへの接続は切ってください。
189
+
190
+ ![古い接続を切る](6cd01921271cd733b529ab19ae327320.png)
191
+
192
+ このような感じでいかがでしょうか?