19870


アプリ開発初心者です。

PickerViewを同じ画面内に二つ配置し、  
それぞれ別の値を保持し、ラベルに出力しようと思っているのですが、  
以下のコードで実行すると、二つとも同じ値で表示されてしまいます。  
何か解決はありますでしょうか？

回答、よろしくお願い致します。

[code]

    @IBOutlet weak var pickerview1: UIPickerView!
    var list: [[String]] = [
        ["容量"],
        ["30"],
        ["ml"]
    ]
    
    @IBOutlet weak var pickerview2: UIPickerView!
    var list2: [[String]] = [
        ["0"],
        ["時"],
        ["0"],
        ["分"]
    ]
    
    override func viewDidLoad() {
        for a in 31...150  {
            var b : String = ""
            b = String(a)
            list[1].append(b)
        }
    
        for c in 1...23 {
            var d : String = ""
            d = String(c)
            list2[0].append(d)
        }
    
        for e in 1...59 {
            var f : String = ""
            f = String(e)
            list2[2].append(f)
        }
    
        pickerview1.dataSource = self
        pickerview1.delegate = self
    
        pickerview2.dataSource = self
        pickerview2.delegate = self
    }
    
    @IBOutlet weak var label1: UILabel!    
    
    func numberOfComponentsInPickerView(pickerview1: UIPickerView) -> Int {
        return list.count
    }
    
    func pickerView(pickerview1: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return list[component].count
    }
    
    func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView {
        let label = UILabel(frame: CGRectMake(0, 0, pickerView.frame.width/CGFloat(list.count), 44))
        //label.textColor = colorPattern.main()
        label.text = list[component][row] as String
        label.textAlignment = NSTextAlignment.Center
        return label
    }
    
    @IBOutlet weak var label2: UILabel!
    
    func numberOfComponentsInPickerView1(pickerview2: UIPickerView) -> Int {
        return list2.count
    }
    
    func pickerView2(pickerview3: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return list2[component].count
    }
    
    func pickerView2(pickerView2: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView {
        let label2 = UILabel(frame: CGRectMake(0, 0, pickerView2.frame.width/CGFloat(list2.count), 44))
        //label.textColor = colorPattern.main()
        label2.text = list2[component][row] as String
        label2.textAlignment = NSTextAlignment.Center
        return label2
    }
    
    func pickerView(pickerview1: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        label1.text =  "容量" + list[component][row] + "ml"    
    }
    
    func pickerView2(pickerview3: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        label2.text =  "時間" + list2[component][row]
    }
    
[/code]


CC BY-SA 3.0
2015-12-10T13:33:08.817
19857
2015-12-11T10:05:21.600
2015-12-10T22:57:33.223
7362
13606
question
ios swift xcode
Swift 同じViewController内にPickerViewを2つ別の内容で配置


StoryboardでPickerViewのIDをそれぞれ別々に指定しておいて、コード内では  
コールバックメソッドを分けるのではなく、一つのコールバックメソッドで引数  
に入ってくるPickerViewのIDを見て処理を分岐させる必要があると思います。


CC BY-SA 3.0
2015-12-11T05:38:04.640
19867
2015-12-11T05:38:04.640
9212
19857
answer


まず、つぎのふたつのリファレンスを読みましょう。

[UIPickerViewDelegate](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPickerViewDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIPickerViewDelegate/)  
[UIPickerViewDataSource](https://developer.apple.com/library/ios/documentation/iPhone/Reference/UIPickerViewDataSource_Protocol/index.html#//apple_ref/swift/intf/c:objc\(pl\)UIPickerViewDataSource)

`UIPickerView`からDelegate（委託）で送られてくるメソッドは、このふたつのリファレンスに載っているものですべてです。ほかのメソッドが送られることはありません。  
たとえば、

[code]

    func numberOfComponentsInPickerView1(pickerview2: UIPickerView) -> Int
    func pickerView2(pickerview3: UIPickerView, numberOfRowsInComponent component: Int) -> Int
    func pickerView2(pickerView2: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView
    
[/code]

これらのメソッドが送られてくることはけっしてないので、これらのメソッドを実装しても、無意味です。

`pickerview1`も`pickerview2`もおなじDelegate（Datasource）メソッドを送ってきます。この点に、あなたの理解がなかったら、あるいはまちがった理解をしていたなら、正しい理解に改めてください。  
同じメソッドを送ってくるのですから、送り主によって条件分岐して、適切な処理をそれぞれに行わなければいけません。  
一例を示します。

[code]

    func numberOfComponentsInPickerView(_ pickerView: UIPickerView) -> Int {
    if pickerView == pickerview1 {
        return list.count
    } else {
        return list2.count 
    }
    
[/code]


CC BY-SA 3.0
2015-12-11T06:42:11.847
19870
2015-12-11T10:05:21.600
2015-12-11T10:05:21.600
5519
7362
19857
answer