web-dev-qa-db-ja.com

同じUIView内の複数のUIPickerView

私はiOS開発の完全な初心者であり、小さなiOSアプリケーションを作成したいと思います。このアプリケーションでは、3 UIPickerViewsが異なるデータを表示することになっています。

私の問題はディスプレイ上にあります。私はAndroidまたはWindows Phoneで開発することに慣れていますが、UIPickerViewsに異なるデータを取り込む方法がわかりません。

これは私がすでに書いたコードです:

//
//  ViewController.Swift
//  iphoneVersion
//
//  Created by fselva on 13/05/2015.
//  Copyright (c) 2015 fselva. All rights reserved.
//

import UIKit



class ViewController: UIViewController, UIPickerViewDelegate{



@IBOutlet weak var pickerView1: UIPickerView!
@IBOutlet weak var pickerView2: UIPickerView!
@IBOutlet weak var pickerView3: UIPickerView!

var test = ["Todo","Waiting","Maybe","Inbox","Note"]

var test2 = ["@Office","@Computer","@Home","@Meeting", "@Read", "@Achat", "@Call"]



override func viewDidLoad() {
    super.viewDidLoad()
    pickerView1.tag = 1
    pickerView2.tag = 2
    pickerView3.tag = 3
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func numberOfComponentsInPickerView(pickerView : UIPickerView!) -> Int{
    return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
    if pickerView2.tag == 2 {
        return test.count
    } else if pickerView3 == 3{
        return test2.count
    }
    return 1
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {

    if pickerView2 == 2 {
        return test[row]
    } else if pickerView3 == 3{
        return test2[row]
    }
        return ""
}


}

@IBOutlet weak var pickerView1: UIPickerView!は、ストーリーボードからViewController.SwiftへのCtrl +クリックによって自動的に作成されました。

最初のUIPickerViewは現在何も表示しないはずです。 2番目のものはtestを表示し、3番目のものはtest2

インターネットで何時間も調査した後、誰が何を表示する必要があるかを定義するタグについて聞いたことがありますが、機能しません。

私は何か間違ったことをしていますか、どこかで何かを逃していますか?

15
fselva

タグは必要ありません。次を使用してください。

 func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
        if pickerView == pickerView1 {
            //pickerView1
        } else if pickerView == pickerView2{
           //pickerView2
        }

また、IBまたはコードでデリゲートを設定することを忘れないでください。

pickerView1.delegate = self
58
ChikabuZ

Swift 3のTextFieldにあるフルソースの複数UIPickerViewです。

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

@IBOutlet weak var textFiel1: UITextField!

@IBOutlet weak var textFiel_2: UITextField!   


 let piker1 = UIPickerView()
 let piker2 = UIPickerView()

let country = ["Ban","Ind","PK"]
let number = ["1","2","3"]


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    piker1.dataSource = self
    piker1.delegate = self

    piker2.dataSource = self
    piker2.delegate = self


    piker1.tag = 1
    piker2.tag = 2;



     textFiel1.inputView = piker1
      textFiel_2.inputView = piker2


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}



func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {



    if pickerView == piker1 {
        return country.count

    } else if pickerView == piker2{
         return number.count
    }

    return 1
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {


    if pickerView == piker1 {
        return country[row]

    } else if pickerView == piker2{
         return number[row]
    }
    return ""
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if pickerView == piker1 {
        textFiel1.text = country[row]
          self.view.endEditing(false)
    } else if pickerView == piker2{
        textFiel_2.text = number[row]
          self.view.endEditing(false)
    }
}

}
2
Enamul Haque

インスタンスをタグと比較しています。

交換:

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    if pickerView2 == 2 {
        return test[row]
    } else if pickerView3 == 3{
        return test2[row]
    }
        return ""
}

で:

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    if pickerView2.tag == 2 {
        return test[row]
    } else if pickerView3.tag == 3 {
        return test2[row]
    }
        return ""
}

とにかく、ピッカーにタグを付ける必要はありません。ピッカーはデータソースに含まれ、メソッドを委任します。インスタンスを比較できます。このようなもの:

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    if pickerView2 == pickerView {
        return test[row]
    }
    if pickerView3 == pickerView {
        return test2[row]
    }
    return ""
}
2
kanobius

コントローラで変数を定義し、フィールドの選択に基づいて値を決定することをお勧めします

func textFieldDidBeginEditing(_ textField: UITextField) {
        if(textField == self.txtAge){
            **isAgeField=0**
            self.pickUp(txtAge)
        }else{
            **isAgeField=1**
            self.pickUpTimezone(timezonetxt)
        }
    }`

then you can add condition inside the picker view as below 

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
       if isAgeField == 1 {
            return timeZoneList.count
        }else {
            return arrAge.count
        }
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{
        if isAgeField == 1 {
            return timeZoneList[row]
        }else {
            return arrAge[row] as? String
        }


    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        **if isAgeField == 1 {**
            timeZonepickerViewIndex = row
        }else  {
            selectedIndex = row
        }

    }
0
Narayan Kushwah