2016-07-23 16 views
1
zu sehen

Hier ist der Code, den ich derzeit habe:Variable Null, wenn versucht wird, Variable zu übergeben, um Controller mit Segment

var valueToPass: String!

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { 
    let indexPath = tableView.indexPathForSelectedRow(); 
    let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as UITableViewCell!; 

    valueToPass = currentCell.textLabel.text // valueToPass now equals "test" 
    performSegueWithIdentifier("yourSegueIdentifer", sender: self) 

} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    var viewController = segue.destinationViewController as AnotherViewController 
    viewController.passedValue = valueToPass // valueToPass equals nil here? Why? 
} 

wie Sie sehen können, habe ich in didSelectRowAtIndexPath "test" zu valueToPass zugeordnet, sondern in prepareForSegue ist valueToPass nil? Warum?

+0

ist Ihre Tabellenansicht in einem Storyboard mit dem Segment? Wenn das der Fall ist, bin ich mir nicht sicher, dass 'tableView: didSelectRowAtIndexPath:' tatsächlich vor 'prepareForSegue: sender:' aufgerufen wird. Sie können dies testen, indem Sie Haltepunkte in beiden Methoden löschen und erst beim Tippen auf die Zelle sehen, was zuerst passiert ist. Versuchen Sie, 'prepareForSegue: sender:' frei von impliziten Abhängigkeiten von anderen Methoden zu halten. – markedwardmurray

Antwort

1

Versuchen ersetzen:

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { 
    let indexPath = tableView.indexPathForSelectedRow(); 
    let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as UITableViewCell!; 

    valueToPass = currentCell.textLabel.text // valueToPass now equals "test" 
    performSegueWithIdentifier("yourSegueIdentifer", sender: self) 

} 

mit diesem:

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { 

    let currentCell = tableView.cellForRowAtIndexPath(indexPath.row) as! UITableViewCell; 

    valueToPass = currentCell.textLabel.text! // valueToPass now equals "test" 
    performSegueWithIdentifier("yourSegueIdentifer", sender: self) 

} 

Auch wenn Sie die Segue im Storyboard gemacht, stellen Sie sicher, dass Sie nicht aus der Tableview zum nächsten Viewcontroller ziehen DID. Dies liegt daran, dass, wenn Sie dies automatisch tun, der Vorgang "segue" vor didSelectRow ... aufgerufen wird, damit er den Übergang ausführt, bevor Sie den Wert festlegen. Ziehen Sie einfach den Viewcontroller, der die Tabellenansicht hostet, in die neue Ansicht.

+0

"Wenn Sie das Segment im Storyboard erstellt haben, stellen Sie sicher, dass Sie NICHT von der Tabellenansicht zum nächsten Viewcontroller ziehen. Wenn Sie dies tun automatisch, dann führen Sie segue wird aufgerufen VOR didSelectRow ... so dass es den Übergang durchführen, bevor Sie den Wert einstellen. Ziehen Sie einfach von der Viewcontroller, der die Tabellenansicht auf die neue Ansicht hostet. " Das war das Problem. vielen Dank! – johnniexo88

+0

Kein Problem :)! – Tob