2016-07-23 15 views
2

Mein Ziel ist es, zu einem anderen View-Controller zu gehen, während man eine Variable übergibt.Variable von tableView zu prepareForSegue übergeben?

hier ist mein Code:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let name : String=arrDict[indexPath.row].valueForKey("name") as! String 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if segue.identifier == "SecondSegue" { 
     let viewController = segue.destinationViewController as! SecondViewController 
     viewController.passedVariable = name 
    } 
} 

wie Sie sehen können, ich versuche prepareForSegue die Variable name an die Funktion zu übergeben. Wie gesagt, mein ultimatives Ziel ist es, eine Variable an einen anderen View-Controller zu übergeben und diese Ansicht zu öffnen.

gerade jetzt, PreparateForSegue kann das tun, aber ich brauche nur die Variable übergeben. vielleicht gibt es eine Möglichkeit, das direkt in func tableView zu tun?

+0

Möchten Sie, dass es segnet, wenn Sie auf die Zelle klicken? – Sethmr

+0

@Sethmr ja ich mache – johnniexo88

Antwort

1
var name: String?  

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     name = arrDict[indexPath.row].valueForKey("name") as? String 
     performSegueWithIdentifier("SecondSegue", sender: nil) 

    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
     if let viewController = segue.destinationViewController as? SecondViewController { 
      if name != nil { 
       viewController.passedVariable = name! 
      } else { 
       print("failed to get name from dictionary") 
      } 
     } 
    } 

Ich glaube, das ist, was Sie suchen. Weisen Sie den Variablennamen in cellForRowAtIndexPath nicht zu, da diese Funktion normalerweise viele Male in der Lebensdauer der TabelleViews aufgerufen wird. Außerdem muss "name" eine Klassenvariable sein, damit Sie sie in einer Funktion zuweisen und in einer anderen übergeben können. cellForRowAtIndexPath ist eine Funktion zum Zuweisen der Werte und UI jeder einzelnen Zelle der tableView. Es gibt sehr wenige Zeiten, um etwas anderes damit zu tun.

+0

Bitte erläutern Sie dies ... "Weisen Sie den Variablennamen in cellForRowAtIndexPath nicht zu, da diese Funktion normalerweise viele Male in der Lebensdauer von TableViews aufgerufen wird." – johnniexo88

+0

Jedes Mal, wenn Sie tableView.ReloadData() aufrufen, wird cellForRowAtIndexPath für jede Zelle der Tabellenansicht aufgerufen. Wenn Sie den Variablennamen innerhalb dieser Funktion deklarieren, wird verhindert, dass er außerhalb der Funktion verwendet wird, da er lokal für die Funktion ist. Zweitens entspricht Ihr aktueller Entwurf immer dem letzten Element Ihrer tableView und nicht irgendeiner gewünschten Zelle. Wenn Sie den Wert des Namens dort festlegen möchten, müssen Sie eine andere Variable einrichten, die die ausgewählte Zelle verfolgt, und wäre nur von außen. – Sethmr

1

Geben Sie Code in Ihre didSelectRowAtIndexPath-Methode ein. Speichern Sie den ausgewählten Indexpfad in einer Instanzvariablen und rufen Sie Ihr Segment auf.

Verwenden Sie in prepareForSegue den gespeicherten indexPath, um die gewünschte Zeichenfolge aus Ihrem Modell zu laden und an die Ziel-VC (viewController) zu übergeben.

+0

können Sie etwas Code posten, damit ich weiß, wohin Sie damit gehen? – johnniexo88

+0

Ich bin kein Fan von Posting-Code für solche einfachen Schritte, da ich denke, dass es zu Kopieren/Einfügen-Programmierung führt, anstatt echtes Lernen. @Sethmr hat Ihnen jedoch Beispielcode gegeben. –

Verwandte Themen