2713


Xcode6 + Swift での質問です。

初心者で申し訳ないのですが、分かりやすく答えて頂けると幸いです。

`ViewController` に `UILabel` ２つと `UIButton`
１つを設置し、ボタンを計３回押すという設定(３回押すと次の画面が表示されるという意味)をしました。ボタンの名称を _Button_ 、ラベルの名称を
_LabelA_ 、 _LabelB_ と定義すると、

  1. _Button_ プッシュ１回目→  
_LabelA_ が「α」という文字列を、 _LabelB_ が「β」という文字列を表示

  2. _Button_ プッシュ２回目→  
「α」であった _LabelA_ は「γ」を、「β」であった _LabelB_ は「δ」を表示

  3. _Button_ プッシュ３回目→  
次の _ViewController_ に移動

という感じで、プログラミングしたいのですが、どのようにコードを打てばいいのか思いつきません。 `var` や `LabelA.text = "α"`
など使ってみたのですが、それではどうしても「α」から「γ」に推移しません。

Xcode で Swift をお使いのお詳しい方がいましたら、是非ご回答宜しくお願い致します。


CC BY-SA 3.0
2014-12-27T13:12:17.247
2702
2014-12-29T00:06:58.323
2014-12-29T00:06:58.323
30
5832
question
swift xcode
Xcode6 + Swiftで、Button を押した回数に応じて Label の内容を変えたい


> どのようにコードを打てばいいのか思いつきません

について回答します。

  1. ボタンとラベルをSwiftファイルへ接続します
  2. ボタンイベント（Touch up Inside）をSwiftファイルへ挿入（イベントに対応するアクションのメソッドをSwiftファイルへ記述）します

ここまでは、できているとします。

  3. 文字の配列とタップ回数を記録する整数を用意します

  4. タップされたらカウントを加算し、タップ回数に応じて文字を更新する処理を書きます
  5. タップ回数が用意した文字の数を超えていたら画面遷移するように処理を挟みます

以下はコードの一例です。

[code]

    import UIKit
    
    class ViewController: UIViewController {
      // 1
      @IBOutlet weak var LabelA: UILabel!
      @IBOutlet weak var LabelB: UILabel!
      @IBOutlet weak var Button: UIButton!
    
      // 3
      var charsA: Array = ["A", "α", "γ"]
      var charsB: Array = ["B", "β", "δ"]
      var tapCount: Int = 0
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
        // 初期化
        self.initEveryone()
      }
    
      // 各部の初期化
      func initEveryone() {
        self.tapCount = 0 // カウント
        self.updateCharacters(0) // ラベルテキスト
      }
    
      // 文字のアップデート
      func updateCharacters(index: Int) {
        self.LabelA.text = self.charsA[index]
        self.LabelB.text = self.charsB[index]
      }
    
      // 次の画面を開く
      func presentNextViewController() {
        // 画面遷移のコードをここに書く...
        println("Go to next page.")
      }
    
      // 2
      @IBAction func didTapButton(sender: AnyObject) {
    
        // タップ回数を加算
        self.tapCount++
    
        // 用意した文字の数をタップ回数が超えている場合
        if (self.charsA.count <= self.tapCount) {
          // 画面遷移
          self.presentNextViewController()
          return
        }
    
        // タップ回数に応じた文字に更新
        self.updateCharacters(self.tapCount)
      }
    }
[/code]

このコードの考え方について書いておきます。

**順番を保ったまとまりであるArray**

今回のように、「次の文字」が決まっている場合は要素を順番に並べておけるArrayに全ての文字を入れておき、何番目の文字が欲しいか指定するだけで取り出せるようにしておきます。

**タップ回数を記録する**

タップした回数が重要な判断基準であるのなら、その回数を記録する整数を用意して、タップされるたびに加算します。この数値を元に、用意した文字をArrayから取り出し、画面遷移をするかどうか判断します。

**コードに意図を込める**

もし、タップした回数ではなく、現在表示されている文字が画面遷移するかどうかの判断として重要であるなら、比較文は以下のようにします。

[code]

    if (self.LabelA.text == "γ") {
      // 画面遷移
      self.presentNextViewController()
      return
    }
[/code]

**処理を複数の小さなメソッドに分ける**

初心の時期、処理が小分けされているとややこしく感じるかもしれませんが、ひとつの意味ある処理のまとまりを再利用するためにはとても大切です。

今回は、番号を指定して文字を更新する「updateCharacters()」を用意しています。これは、タップ回数に応じた文字の更新と、0を渡すことで文字を初期状態にするのと、二カ所で利用されています。

また、カウントを0に戻して文字を初期状態にする処理が「initEveryone()」として書かれています。これは、例えば画面遷移をした後この画面を初期状態に戻したいといった場合に役立ちます。


CC BY-SA 3.0
2014-12-27T17:23:06.810
2713
2014-12-27T17:23:06.810
2702
answer