Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 321 - My Picker Project : ダブルピッカー

Swiftで遊ぼう!の古い記事-> Life-LOG OtherSide
質問 : Swiftで遊ぼう! - 252 - FaceViewプロジェクト始動 - Swiftで遊ぼう! on Hatena

Beginning iPhone Development with Swift: Exploring the iOS SDK

Beginning iPhone Development with Swift: Exploring the iOS SDK

Single Component Pickerが表示されない原因が分かっていないのですが、先に進みます。

次は独立した項目を複数選択するダブルピッカーの実装ですが、シングルピッカーと同様なので少し端折って説明します。

基本的に使用するオブジェクトはシングルピッカーと同じなので、ストーリーボード上の作業も全く同じと言って差し支えないでしょう。

UIPickerViewをオブジェクト・ライブラリから引っ張ってきて、「Ctrl + ドラッグ」してDoubleComponentPickerViewControllerクラスに「doublePicker」というOutletを作ります。

ボタンも同様に「buttonPressed」メソッドを作ります。

デリゲーションの設定も忘れずにします。

DoubleComponentPickerViewClassのコードをみていきます。

項目(Component)は行(Row)並びで2つあります。左から右へ、並び番号「0」「1」が設定されていて、サンドイッチの具材(フィリング)とパン(ブレッド)のアレー型定数が用意されます。

 private let fillingComponent = 0 // 可読性を維持させるため
 private let breadComponent = 1
 private let fillingTypes = ["ハム", "ターキー", "ピーナツバター",
         "ツナサラダ", "チキンサラダ", "ローストハム", "ベジミート" ]
 private let breadTypes = ["白パン", "全粒パン",
         "ライパン", "玄米パン","米パン"]

メソッドの実装も同様です。UIPickerViewのメソッドを使って選択項目が何行目になるのか知る必要があります。

let fillingRow = doublePicker.selectedRowInComponent(fillingComponent)
let breadRow = doublePicker.selectedRowInComponent(breadComponent)

選択項目がアレーの何番目か数字で保持して、その数字を使って項目名を取り出します。

let filling = fillingTypes[fillingRow]
let bread = breadTypes[breadRow]

後はいつものアラートを使って表示させます。

 let message = "\(filling)\(bread)で挟んで用意します。"
 let alert = UIAlertController(title: "ご注文ありがとうございます。",
                               message: message, preferredStyle: .Alert)
 let action = UIAlertAction(title: "素晴らしい",
                            style: .Default, handler: nil)
 alert.addAction(action)
 presentViewController(alert, animated: true, completion: nil)

そして、最後のプロトコール準拠のためのメソッド実装です。コンポーネントが2つなので「if else」で選択させていますが、3つ以上なら「switch case」を使うのが妥当です。

// MARK: Picker Data Source Methods
    
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
 return 2
}
    
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
 if component == breadComponent {
  return breadTypes.count
 } else {
  return fillingTypes.count
 }
}

// MARK: Picker Delegate Methods
    
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
 if component == breadComponent {
  return breadTypes[row]
 } else {
  return fillingTypes[row]
 }
}

これでラン(Cmd + R)させます。

f:id:yataiblue:20150521104005j:plain

明日から取り組むDependent Pickerは少々複雑になるので楽しみです。

今日はここまで。