Ich versuche, Daten von einer Tabelle in viewController A an viewController B zu senden. Wenn ich es jedoch versuche, erhalte ich immer die Fehlermeldung Unexpectedly found nil.

Ich habe alle meine Daten in einem Datenklassenarray, das aufgerufen und in die Tabellenzellen geschrieben wird. Dann habe ich einen Abschnitt, der die selectedCell Daten an eine Variable im 2. viewController mit dem Namen {{X1 weitergeben soll }}

if segue.identifier == "viewMemorySegue" {
            let viewMemoryVC = segue.destinationViewController as! memoryViewierViewController
            viewMemoryVC.cellData = selectedCell!
        }

Ich habe dann eine didSelectRow Funktion, die die selectedCell Daten und dann performing segue einstellt

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectedCell = cacheData[indexPath.row]
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    performSegueWithIdentifier("viewMemorySegue", sender: self)
}

Ich habe print(cellData.memoryTitle) innerhalb der didSelect -Funktion müde, um zu sehen, ob es Null war, aber es wurden die richtigen Daten ausgedruckt.

Ich bin neu in Xcode und schnell, so dass jede Hilfe geschätzt wird !!!

GITHub-Projektlink https://github.com/Matthammond96/Relive

0
Matt Hammond 31 Dez. 2015 im 17:10

3 Antworten

Beste Antwort

Sie haben einen Auswahlbereich in Ihrem Storyboard festgelegt, der das MemoryViewerViewController öffnen soll, und ich sehe keinen Delegatensatz im FindCacheViewController, sodass Ihre didSelectRowAtIndexPath -Funktion daher nicht aufgerufen wird ... Ihre selectedCell -Eigenschaft wird nicht festgelegt.

enter image description here

Ich würde den Storyboard-Übergang entfernen, den Sie haben, Ihren Delegaten richtig einrichten und dann sollte es funktionieren.

Ich habe eine Druckausgabe in didSelectRowAtIndexPath hinzugefügt und sie wurde nie aufgerufen.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("TEST")
        selectedCell = cacheData[indexPath.row]
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
        //performSegueWithIdentifier("viewMemorySegue", sender: self)
   }

Wie Sie feststellen werden, habe ich auch den Methodenaufruf performSegueWithIdentifier auskommentiert, und der Segue hat immer noch versucht, aus dem Storyboard-Segue herauszukommen, den Sie haben.

3
Scriptable 31 Dez. 2015 im 15:00

Wenn Ihre Daten global sind, müssen Sie sie nicht in VC B deklarieren. Wenn sie in Seite VC A lokal sind, müssen Sie sie in VC B deklarieren. Erstellen Sie dann in Ihrem VC B das var selectedIndexPath: NSIndexPath? . Erstellen Sie dann in Ihrem VC A var selectedIndexPath: NSIndexPath?. Senden Sie dann in Ihrer didSelectRowAtIndexPath - Funktion den ausgewählten Indexpfad wie folgt an selectedIndexPath tableView.indexPathForCell(cellFromDelegateMethod)

Und dann

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "viewMemorySegue" {            
        let viewMemoryVC = segue.destinationViewController as! memoryViewierViewController
        viewMemoryVC.selectedIndexPath = selectedIndexPath!
    }
  }
1
appiconhero.co 31 Dez. 2015 im 14:43

Betrachten Sie den folgenden Code:

First View Controller mit der Tabellenansicht:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    private var cellData: String!
    //MARK - TableViewDatasource
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell")
        cell?.textLabel?.text = "data \(indexPath.row)"
        return cell!
    }

    func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
        let cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
        self.cellData = cell.textLabel?.text
        performSegueWithIdentifier("AnotherViewControllerSegue", sender: self)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            let destinationVC : AnotherViewController = segue.destinationViewController as! AnotherViewController
            destinationVC.data = self.cellData;
        }
    }

Als nächstes ein anderer View Controller mit der Eigenschaft, die Daten zu speichern

class AnotherViewController: UIViewController {
    var data:NSString!
        override func viewDidLoad() {
        super.viewDidLoad()
            NSLog(self.data as String)
    }
}
0
Anand 31 Dez. 2015 im 15:04