2015-05-14 6 views
8

Sono un principiante assoluto su iOS Dev e voglio creare una piccola applicazione iOS. Su questa applicazione, 3 UIPickerViews devono visualizzare dati diversi.Più UIPickerView nello stesso UIView

Il mio problema è sul display. Sono abituato a svilupparlo su telefono Android o Windows e non capisco come popolare lo UIPickerViews con dati diversi.

Questo è il codice che ho già scritto:

// 
// 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! è stata creata automaticamente con Ctrl + clic dallo storyboard alla ViewController.swift.

Attualmente il primo UIPickerView non visualizza nulla. Il secondo dovrebbe visualizzare test e il terzo visualizza test2.

Dopo ore di indagini su Internet, ho sentito parlare dei tag per definire chi deve mostrare cosa, ma non funziona.

Sto facendo qualcosa di sbagliato, mi manca qualcosa da qualche parte?

risposta

33

Non hai bisogno di tag, basta usare:

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

, inoltre, non dimenticare di impostare delegato in IB o nel codice:

pickerView1.delegate = self 
+0

Grazie per la risposta, Controllerò cosa delegare è capire cosa mi hai detto. Inoltre proverò la soluzione che dici, grazie. – fselva

+0

metti pickerView1.delegate = self in viewDidLoad() – ChikabuZ

+0

Ok, funziona come un incantesimo, mi mancava solo il delegato ..... Grazie mille! – fselva

0

si sta confrontando le istanze con i tag.

Sostituire:

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 "" 
} 

con:

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 "" 
} 

In ogni caso, non è necessario codificare i vostri raccoglitori. I raccoglitori entrano nell'origine dati e delegano i metodi. È possibile confrontare le istanze. Qualcosa di simile a questo:

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

grazie per le vostre risposte. Ciò che mancava era il delegato. Ho provato questo un paio d'ore fa e non ha funzionato perché non ho fatto pickerViewX.delegate = self. La tua soluzione funziona bene. – fselva

-1

Prova questa:

enter image description here

class UserConfig: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 

    @IBOutlet weak var lblPeso: UILabel! 
    @IBOutlet weak var lblAlto: UILabel! 
    @IBOutlet weak var pickerView: UIPickerView! 
    @IBOutlet weak var btPeso: UIButton! 
    @IBOutlet weak var btAlto: UIButton! 

    var pulsado = 1 

    let userDefault = UserDefaults.standard 
    let pesoArray = [50,51,52,53,54,55,56,57,58,59, 
        60,61,62,63,64,65,66,67,68,69, 
        70,71,72,73,74,75,76,77,78,79, 
        80,81,82,83,84,85,86,87,88,89, 
        90,91,92,93,94,95,96,97,98,99, 
        100,101,102,103,104,105,106,107,108,109, 
        110,111,112,113,114,115,116,117,118,119, 
        120,121,122,123,124,125,126,127,128,120, 
        130] 
    let altoArray = [150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 
        160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 
        170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 
        180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 
        190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 
        200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 
        210, 211, 212] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     pickerView.delegate = self 
     pickerView.dataSource = self 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.view.endEditing(true) 
    } 
    @IBAction func volver(_ sender: Any) { 

     self.dismiss(animated: true, completion: nil) 
    } 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     if pulsado == 1 { 
      return altoArray.count 
     } else { 
      return pesoArray.count 
     } 
    } 

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

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

     if pulsado == 1{ 
      return String(format: "%i", altoArray[row]) 
     }else{ 
      return String(format: "%i", pesoArray[row]) 
     } 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     if pulsado == 1 { 
      lblAlto.text = String(format: "%i", altoArray[row]) 
     } else { 
      lblPeso.text = String(format: "%i", pesoArray[row]) 
     } 
    } 
    @IBAction func altoPressed(_ sender: Any) { 

     pulsado = 1 
     pickerView.reloadAllComponents() 

    } 
    @IBAction func pesoPressed(_ sender: Any) { 

     pulsado = 2 
     pickerView.reloadAllComponents() 

    } 
} 
0

Ecco sorgente completa UIPickerView multipla nel TextField a Swift 3

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) 
    } 
} 

}