2015-03-08 4 views
5

Hallo, ich habe versucht, dies funktioniert seit Ewigkeiten ohne Erfolg so Entschuldigung, wenn dies für Sie einfach scheint.Verwenden von UIPickerView mit mehreren Komponenten in swift

Ich möchte ein 3-Rad-UIPickerView verwenden - Der 1. Rad didSelectRow-Wert wird verwendet, um das Array für die verbleibenden zwei Räder zu ändern, aber sie werden die gleiche sein, wie es eine Conversion-App ist.

Es scheint mir einen Fehler zu verursachen, wenn die Räder bevölkert werden und gesagt wird, dass AnyObject nicht mit String identisch ist. Ich kann nichts falsches sehen, aber ich weiß, dass es etwas ist, das ich vermisst habe.

Alle Zeiger würde sehr geschätzt werden.

Motty.

// ViewController.swift 
// picker test 

import UIKit 

class ViewController: UIViewController, UIPickerViewDelegate { 

    @IBOutlet weak var picker1Label: UILabel! 
    @IBOutlet weak var picker2Label: UILabel! 

    @IBOutlet weak var bigPicker: UIPickerView! 

    var wheelContents = [] 
    var length = ["metres","feet","yards","inches","mm","cm","miles"] 
    var volume = ["m3","US Gall","Imp Gall","Barrels", "cubic FT","litres"] 
    var conType = ["length","volume"] 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     wheelContents = [conType,length,length] 

    } 

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


    //For main selection of type of conversion 
    // returns the number of 'columns' to display. 
    func numberOfComponentsInPickerView(bigPicker: UIPickerView) -> Int{ 

     return wheelContents.count 

    } 

    // returns the # of rows in each component.. 
    func pickerView(bigPicker: UIPickerView, numberOfRowsInComponent component: Int) -> Int{ 

     return wheelContents[component].count 


    } 

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

     return wheelContents[component][row] 

    } 
} 

Antwort

1

Sie müssen Swift sagen, dass Ihr wheelContents Array ist ein Array von Array von String:

var wheelContents:[[String]] = [] 

Wenn Sie nicht explizit wheelContents einen Typ geben Sie folgert Swift es NSArray, die zu sein Was gibt dir Probleme?

1

Sie müssen zügig sagen, dass Ihr wheelContents ist ein Array von String-Arrays:

var wheelContents:[[String]] = [] 

Auch sollten Sie den Delegaten Ihrer pickerView-self gesetzt, weil Sie die Delegierten in der Klasse behandeln. Sonst werden nicht die Funktionen richtig funktionieren:

//In the viewDidLoad method 
bigPicker.delegate = self 
+0

Vielen Dank –

1

Da Sie wheelContents wie diese wheelContents = [] erklärt, ohne seine Elemente Typ Angabe der Compiler automatisch folgert, dass es Array von AnyObjects ist aka [AnyObject].

Das ist der Grund, warum, wenn Sie wheelContents[component].count zurückkehren es einen Fehler erzeugt: in diesem Moment der Compiler eine String! erwartet aber eine AnyObject bieten.

Es ist eine wirklich einfache Lösung, Sie sollten nur angeben, was der Inhalt des Arrays sein wird, wenn Sie es deklarieren. (Es ist ein Array von Arrays von Strings aka [[String]])

0

Sie müssen die Datenquelle von picker setzen zusammen mit den Delegierten in viewDidLoad

pickerView.dataSource = self