2017-02-16 3 views
1

Ich arbeite an einer App und ich muss Daten in einem Array von einem View-Controller zum anderen senden. Ich ziehe einen String von einem Label in eine Variable und hänge sie an das Array an.Übergeben von Arrays in Swift

var time:String = timeLabel.text! 
timeArray.append(time) 
print("add data") 

ich dann eine prepareForSegue Funktion, wo ich will Daten, um von firstViewController zu SecondViewController

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    let nvc = segue.destinationViewController as! SecondViewController 
    nvc.timeArray2 = timeArray 
} 

In meinem secondViewController, ich habe alle notwendigen Funktionen für einen tableView, aber meine Tableview nie auffüllt mit allen Daten, wie die timeArray2 ist leer und wird entweder zu einem Absturz oder in einem leeren tableView führen.

override func viewWillAppear(animated: Bool) 
{ 
    scrambleTimeTableView.reloadData() 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    return timeArray2.count 
} 


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    let cell = scrambleTimeTableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) 

    cell.textLabel?.text = timeArray2[indexPath.row] 
    cell.textLabel?.font = UIFont(name: "Arial", size: 18) 
    cell.textLabel?.textColor = UIColor.blueColor() 

    print("Populate tableview") 

    return cell 
} 

Alles, was ich vermisse?

EDIT:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 

    let cell = scrambleTimeTableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) 

    cell.textLabel?.text = timeArray2[indexPath.row] 
    cell.textLabel?.font = UIFont(name: "Arial", size: 18) 
    cell.textLabel?.textColor = UIColor.blueColor() 

    print("Populate tableview") 

    return cell 
} 

ich einen Absturz auf cell.textLabel?.text = timeArray2[indexPath.row], da das Array in dem secondViewController leer. Der Fehler lautet:

Thread 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

Die Ausgabe sagt:

empty

[]

fatal error: Index out of range

(lldb)

ich es das Array gedruckt habe und es war voll/leer, zusammen mit, wenn das Array in dem firstViewController füllt, das wie folgt aussieht dies:

add data

["01.12"]

add data

["01.12", "01.48"]

So weiß ich, dass das erste Array füllt, und es ist nicht imstande, alle Daten an den zweiten Controller zu senden.

+0

Haben Sie 'tableView delegate' und' dataSource' festgelegt? – JuicyFruit

+0

Initialisieren Sie das Array: timeArray = [String](), bevor Sie es verwenden? – Greg

+0

Ja zu beiden, mein timeArray ist initialisiert und ich habe den Delegaten und dataSource – jmur216

Antwort

2

Das Übergeben von Informationen zwischen View-Controllern kann schwierig sein, besonders wenn einer von ihnen eine Tabellenansicht ist. Der Zeitpunkt der Ereignisse ist irgendwie nicht intuitiv. Um Probleme zu vermeiden, sollten Sie nicht davon ausgehen, dass die Dinge in einer bestimmten Reihenfolge geladen werden.

In Ihrem speziellen Fall ist es möglich, tableView(tableView: UITableView, numberOfRowsInSection section: Int) bevor die Segue (die API nicht garantieren, dass diese nicht passieren, nicht so müssen wir diesen Fall behandeln) geschehen aufgerufen wird.

Der Fix: zuerst, nie Verwendung Force-unwrapped Optionals (der! -Operator). Optionals gibt es aus genau diesem Grund: Wenn etwas optional ist, müssen Sie prüfen, ob es gültig ist, bevor Sie es verwenden - es ist ein "Hinweis", dass die Daten zu einem bestimmten Zeitpunkt nicht gültig sein können.

Zweitens: Verwenden Sie ein didSet in Ihrem timeArray Ihre reloadData()

So etwas auslösen:

var timeArray: [MyTimeType] = [] { 
    didSet { 
     tableView.reloadData() 
    } 
} 

Auch Ihre segue Funktion wie folgt sein sollte:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    if let nvc = segue.destinationViewController as? SecondViewController { 
     nvc.timeArray2 = timeArray 
    } 
} 

Die destinationViewController kann oder darf nicht die sein, die Sie erwarten - Sie sollten immer überprüfen.

Hoffe, dass hilft!