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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1585閲覧

一つのボタンで異なるアラートを表示したい。

mokoporon

総合スコア26

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/09/24 15:58

Buttonを押すことでアラートが表示され、選択肢次第で異なる結果の文字がlabelに反映される方法を勉強中です。

結果の文字がlabelに表示されたのち、先ほど押したButtonを押すと、先ほどとは異なるアラートが表示され、その選択肢次第によって、異なる結果の文字が表示される…という具合に、樹形図的広がりを見せるようにしたいと考えています。たとえば、最初にButtonを押すことでアラート1が表示され、選択肢A・BのうちAを選ぶと、ある文章が表示されます。そこから先ほどと同じButtonを押すとアラート2が表示され、選択肢が出てくる…。という具合にしたいです。

UIAlertAction 中にさらに選択肢の定数(let c & let d)を置き、alertController2 として別アラートにして表示させるという指示を @IBAction func button の中に置けばいけるのかと思いましたが、さすがに無理があるというか、安直というか、そう都合よくは行きませんでした。

とりあえず、アラート1でAを選択した場合に、アラート2でC/Dという選択肢が表示されるようにしたいと考えています。

この場合、どの点を改善していけばよろしいでしょうか。どうかご教授をお願いしたいです。

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var label: UILabel! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 } 10 11 override func didReceiveMemoryWarning() { 12 super.didReceiveMemoryWarning() 13 } 14 15 @IBAction func button(_ sender: Any) { 16 17 18 let alertController = UIAlertController(title: "アラート1", message: "どうしますか?", preferredStyle: UIAlertControllerStyle.alert) 19 20 let alertController2 = UIAlertController(title: "アラート2", message: "どうしますか?", preferredStyle: UIAlertControllerStyle.alert) 21 22 let a = UIAlertAction(title:"A", style: UIAlertActionStyle.default) 23 { (action: UIAlertAction) in 24 self.label.text = "Aを選んだ場合の結果文" 25 26 //この部分に無理やり感があります。 27 28 let c = UIAlertAction(title:"C", style: UIAlertActionStyle.default) 29 { (action: UIAlertAction) in 30 self.label.text = "Cを選んだ場合の結果文" } 31 32 let d = UIAlertAction(title:"D", style: UIAlertActionStyle.default) 33 { (action: UIAlertAction) in 34 self.label.text = "Dを選んだ場合の結果文" } 35 } 36 37 let b = UIAlertAction(title:"B", style: UIAlertActionStyle.default) 38 { (action: UIAlertAction) in 39 self.label.text = "Bを選んだ場合の結果文" } 40 41 alertController.addAction(a) 42 alertController.addAction(b) 43 44 //ここでエラー(Use of unresolved identifier 'c' / 'd')が発生。 45 alertController2.addAction(c) 46 alertController2.addAction(d) 47 48 present(alertController, animated: true, completion: nil) 49 present(alertController2, animated: true, completion: nil) 50 } 51 52}

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

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

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

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

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

guest

回答1

0

ベストアンサー

無理やり感が何から来ているかというのは、なんとなく理解出来ていると思いますがそういう時は可能な限り処理をシンプルになるように分けると良いです。

今回の場合は、
0. ボタンが押されたらアラートが表示される
0. アラートで選択された状況を記録しておく
0. ラベルをアラートで選択された状況を元に更新する

1つ目は、表示する部分のロジックは出来ていると思うので整理するだけで良いと思います。
2つ目は、メンバー変数でもデータベースでも方法は良いので、ユーザの操作した結果を記録する処理を用意します。
3つ目は、2つ目で用意した値を元にラベルを書き換えるだけです。

ここまで出来たら、1つ目に戻って2つ目で保存している内容を元に次の表示内容をセット出来る仕組みに変更します。

この流れで実装しておけば、樹形図の階層が深くてもソースはシンプルな状況が保ています。
参考になれば幸いです。

投稿2017/09/25 00:18

YasuhiroMiyake

総合スコア1336

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問