質問編集履歴

2 スクリーンショットの掲載やりなおし

Tomzy

Tomzy score 100

2018/10/25 23:41  投稿

複数のボタンをひとつのIBActionにつなげる方法 その2 (アラートなど複雑なコードを簡単に装着する方法)
### 質問の概要
fuzzballさんとtyobigorouさんの助言で複数のボタンをひとつのIBActionにつなげる方法は解決しましたが、そのコードを応用して、より複雑なtextFieldを操作することとアラートを表示することを試しましたが、上手くいかず、ボタンの数13個分のCase6からCase19まですべてにコードを書くことになりました。アラートのコードをCaseの外に書くなど簡略化できないかご指導ください。
### Case1の場合のスクリーンショット
![最初の画面](91eb878de3c9e8bbe92917a44237fa95.png)
![数字を書き込んでカギをタップした場合](d2ffc46487df3759f7ba067f99c3bee4.png)
![カギをタップしてアラートを表示した場合](8c1750d725173115d9e1e3dcac9ef6cc.png)
![アラートのOKをタップした場合→最初の画面と同じです](117cb4e16aa4001556725600509a5ecc.png)
### カギをタップする部分のコード
``` /////ロックボタンの機能
   /// 表示している画像の番号
   var lockImageNo = 0
   // 画像の名前の配列
   let lockImageNameArray = [
       "KagiLock",
       "KagiOpen"]
 
   /// 表示している画像の番号を元に画像を表示する
   func lockImage() -> UIImage? {
       
       // 表示している画像の番号から名前を取り出し
       let name2 = lockImageNameArray[lockImageNo]
       
       // 画像を読み込み
       let image2 = UIImage(named: name2)
    // 画像の番号が正常な範囲を指しているかチェック
       
    // 範囲より下を指している場合、最後の画像を表示
       if lockImageNo < 0 {
           lockImageNo = 1
       }
       
  // 範囲より上を指している場合、最初の画像を表示
       if lockImageNo > 1 {
           lockImageNo = -1
       }
       return image2  //fuzzballさん助言を反映
   }
   
   var count = 0
 
   @IBAction func lockButtonTapped(_ sender: Any) {
      // ロックボタンを押した回数を1増やす
       count = count + 1
       print ("ここまで来たIBAction lockImageに1を加える")
       
       let image2 = displayImage()   //fuzzballさん助言を反映
       
       guard let lockButtonTapped = sender as? UIButton else {
           return
       }
       //複数セルの場合のコード
      switch lockButtonTapped.tag {
       // Image Viewに読み込んだ画像をセット
       case 6:
           
           if count % 2 == 1 {
           print ("ここまで来た case 6")
          textTimeDep01DepCell01.isUserInteractionEnabled = false
               
  imageLockDep01DepCell01.image = UIImage(named: "KagiLock")
           }
//残りが0の場合
       else if count % 2 == 0 {
// アラートの実装
  let alert = UIAlertController(title: "記入済みの時刻を削除します。", message: "表示のOKを押すと削除されて新規に書き込みができます。このまま保存したい場合はキャンセルを押してください", preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "Cancel", style: .default) let okAction = UIAlertAction(title: "OK", style: .destructive) { (action: UIAlertAction) in
//OKをタップするとイメージがオープンになり、textFieldが空になりキーボードが現れインプット可能になる
self.imageLockDep01DepCell01.image = UIImage(named: "KagiOpen")
               self.textTimeDep01DepCell01.isUserInteractionEnabled = true
self.textTimeDep01DepCell01.text = ""
                        }
           
alert.addAction(cancelAction)
alert.addAction(okAction)
present(alert, animated: true, completion: nil)
                   }
case 7:
if count % 2 == 1 {
print ("ここまで来た case 7")
               textTimeArr01DepCell01.isUserInteractionEnabled = false
               
imageLockArr01DepCell01.image = UIImage(named: "KagiLock")
           }
//残りが0の場合
    else if count % 2 == 0 {
// アラートの実装
let alert = UIAlertController(title: "記入済みの時刻を削除します。", message: "表示のOKを押すと削除されて新規に書き込みができます。このまま保存したい場合はキャンセルを押してください", preferredStyle: .alert)
               
let cancelAction = UIAlertAction(title: "Cancel", style: .default)
               
let okAction = UIAlertAction(title: "OK", style: .destructive) { (action: UIAlertAction) in
                   
//OKをタップするとイメージがオープンになり、textFieldが空になりキーボードが現れインプット可能になる
                   self.imageLockArr01DepCell01.image = UIImage(named: "KagiOpen")
                   self.textTimeArr01DepCell01.isUserInteractionEnabled = true
                   self.textTimeArr01DepCell01.text = ""
                   
               }
               
alert.addAction(cancelAction)
               
alert.addAction(okAction)
               
present(alert, animated: true, completion: nil)
       }
       
//ここはカギのイメージのみ記載
case 8:
print ("ここまで来た case 8")
imageLockDep01DepCell02.image = image2
//case9以下は省略
```
### ご参考事項
AAA
環境は下記のとおりです。
MacBook Pro (15-inch, 2016)
High Sierra OS10.13.6
Version 9.4 (9F1027a)Swift4
BBB
交通手段のイメージは意図したとおり変化します。
CCC
case6の場合
imageLockDep01DepCell01.image = image2
とすると何故かタップした時カギのイメージが交通手段の画像が表示されます。いろいろ原因を調べましたが、わかりませんでした。その為、
imageLockArr01DepCell01.image = UIImage(named: "KagiLock")
としました。
DDD
Case6とCase7には個別にコードを書き込みました。その結果最初にカギのボタンをタップするとtextFieldはキーボードが下がり編集不可となり、カギのイメージはロック状態になります。更にボタンをタップするとアラート画面が現れOKボタンをタップすするとtextFieldは空になりキーボードが現れインプットが可能になります。カギイメージは解錠されます。→これが狙った機能です。case6〜case19の簡単なコードの書き方が本質問の課題です。
EEE
Case8以降は画像が変換するIBActionを実装しました。
但し、タップした時カギのイメージが交通手段の画像が表示されます。(textFieldの操作とアラートを書き込む前は正常にカギのイメージが表示されました。)
よろしくお願いします。
### 追加説明(ストーリーボード上のセルとコードとの結びを示すストーリーボード2枚)
![![イメージ説明](939b64433de370c13b64d2f70e3d3b23.png)](fde9363c587fd69e69d2bacbae0ab2ae.png)
![イメージ説明](2e79d790ccb7fb859846ff676ad514c2.png)
![イメージ説明](f189d06700023a88f7c762da1b1bdc09.png)
  • Swift

    14729 questions

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

1 追加情報としてストーリーボードとコードの結び付きをスクリーンショットで説明しました。

Tomzy

Tomzy score 100

2018/10/25 23:38  投稿

複数のボタンをひとつのIBActionにつなげる方法 その2 (アラートなど複雑なコードを簡単に装着する方法)
### 質問の概要
fuzzballさんとtyobigorouさんの助言で複数のボタンをひとつのIBActionにつなげる方法は解決しましたが、そのコードを応用して、より複雑なtextFieldを操作することとアラートを表示することを試しましたが、上手くいかず、ボタンの数13個分のCase6からCase19まですべてにコードを書くことになりました。アラートのコードをCaseの外に書くなど簡略化できないかご指導ください。
### Case1の場合のスクリーンショット
![最初の画面](91eb878de3c9e8bbe92917a44237fa95.png)
![数字を書き込んでカギをタップした場合](d2ffc46487df3759f7ba067f99c3bee4.png)
![カギをタップしてアラートを表示した場合](8c1750d725173115d9e1e3dcac9ef6cc.png)
![アラートのOKをタップした場合→最初の画面と同じです](117cb4e16aa4001556725600509a5ecc.png)
### カギをタップする部分のコード
``` /////ロックボタンの機能
   /// 表示している画像の番号
   var lockImageNo = 0
   // 画像の名前の配列
   let lockImageNameArray = [
       "KagiLock",
       "KagiOpen"]
 
   /// 表示している画像の番号を元に画像を表示する
   func lockImage() -> UIImage? {
       
       // 表示している画像の番号から名前を取り出し
       let name2 = lockImageNameArray[lockImageNo]
       
       // 画像を読み込み
       let image2 = UIImage(named: name2)
    // 画像の番号が正常な範囲を指しているかチェック
       
    // 範囲より下を指している場合、最後の画像を表示
       if lockImageNo < 0 {
           lockImageNo = 1
       }
       
  // 範囲より上を指している場合、最初の画像を表示
       if lockImageNo > 1 {
           lockImageNo = -1
       }
       return image2  //fuzzballさん助言を反映
   }
   
   var count = 0
 
   @IBAction func lockButtonTapped(_ sender: Any) {
      // ロックボタンを押した回数を1増やす
       count = count + 1
       print ("ここまで来たIBAction lockImageに1を加える")
       
       let image2 = displayImage()   //fuzzballさん助言を反映
       
       guard let lockButtonTapped = sender as? UIButton else {
           return
       }
       //複数セルの場合のコード
      switch lockButtonTapped.tag {
       // Image Viewに読み込んだ画像をセット
       case 6:
           
           if count % 2 == 1 {
           print ("ここまで来た case 6")
          textTimeDep01DepCell01.isUserInteractionEnabled = false
               
  imageLockDep01DepCell01.image = UIImage(named: "KagiLock")
           }
//残りが0の場合
       else if count % 2 == 0 {
// アラートの実装
  let alert = UIAlertController(title: "記入済みの時刻を削除します。", message: "表示のOKを押すと削除されて新規に書き込みができます。このまま保存したい場合はキャンセルを押してください", preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "Cancel", style: .default) let okAction = UIAlertAction(title: "OK", style: .destructive) { (action: UIAlertAction) in
//OKをタップするとイメージがオープンになり、textFieldが空になりキーボードが現れインプット可能になる
self.imageLockDep01DepCell01.image = UIImage(named: "KagiOpen")
               self.textTimeDep01DepCell01.isUserInteractionEnabled = true
self.textTimeDep01DepCell01.text = ""
                        }
           
alert.addAction(cancelAction)
alert.addAction(okAction)
present(alert, animated: true, completion: nil)
                   }
case 7:
if count % 2 == 1 {
print ("ここまで来た case 7")
               textTimeArr01DepCell01.isUserInteractionEnabled = false
               
imageLockArr01DepCell01.image = UIImage(named: "KagiLock")
           }
//残りが0の場合
    else if count % 2 == 0 {
// アラートの実装
let alert = UIAlertController(title: "記入済みの時刻を削除します。", message: "表示のOKを押すと削除されて新規に書き込みができます。このまま保存したい場合はキャンセルを押してください", preferredStyle: .alert)
               
let cancelAction = UIAlertAction(title: "Cancel", style: .default)
               
let okAction = UIAlertAction(title: "OK", style: .destructive) { (action: UIAlertAction) in
                   
//OKをタップするとイメージがオープンになり、textFieldが空になりキーボードが現れインプット可能になる
                   self.imageLockArr01DepCell01.image = UIImage(named: "KagiOpen")
                   self.textTimeArr01DepCell01.isUserInteractionEnabled = true
                   self.textTimeArr01DepCell01.text = ""
                   
               }
               
alert.addAction(cancelAction)
               
alert.addAction(okAction)
               
present(alert, animated: true, completion: nil)
       }
       
//ここはカギのイメージのみ記載
case 8:
print ("ここまで来た case 8")
imageLockDep01DepCell02.image = image2
//case9以下は省略
```
### ご参考事項
AAA
環境は下記のとおりです。
MacBook Pro (15-inch, 2016)
High Sierra OS10.13.6
Version 9.4 (9F1027a)Swift4
BBB
交通手段のイメージは意図したとおり変化します。
CCC
case6の場合
imageLockDep01DepCell01.image = image2
とすると何故かタップした時カギのイメージが交通手段の画像が表示されます。いろいろ原因を調べましたが、わかりませんでした。その為、
imageLockArr01DepCell01.image = UIImage(named: "KagiLock")
としました。
DDD
Case6とCase7には個別にコードを書き込みました。その結果最初にカギのボタンをタップするとtextFieldはキーボードが下がり編集不可となり、カギのイメージはロック状態になります。更にボタンをタップするとアラート画面が現れOKボタンをタップすするとtextFieldは空になりキーボードが現れインプットが可能になります。カギイメージは解錠されます。→これが狙った機能です。case6〜case19の簡単なコードの書き方が本質問の課題です。
EEE
Case8以降は画像が変換するIBActionを実装しました。
但し、タップした時カギのイメージが交通手段の画像が表示されます。(textFieldの操作とアラートを書き込む前は正常にカギのイメージが表示されました。)
よろしくお願いします。
よろしくお願いします。
### 追加説明(ストーリーボード上のセルとコードとの結びを示すストーリーボード2枚)
![![イメージ説明](939b64433de370c13b64d2f70e3d3b23.png)](fde9363c587fd69e69d2bacbae0ab2ae.png)
  • Swift

    14729 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る