2017-04-26 4 views
0

Ich arbeite an einer Journal-App und jetzt möchte ich, dass die Leute auf eine Zelle/einen Eintrag klicken können und dann zu einer detaillierteren Ansicht gehen, wo sie ihren Eintrag lesen/bearbeiten können. Die Sache ist, die Saiten, die ich versuche, zur nächsten Ansicht zu gelangen, kommen nicht durch.Daten nicht übergeben in Swift

Edit:

Dies ist der Code auf dem Tableviewcontroller:

class TableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    @IBOutlet weak var tableView: UITableView! 

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
    var items: [Entry] = [] 
    var passedEntry:String = "" 

    func fetchData() { 

     do { 
      items = try context.fetch(Entry.fetchRequest()) 
      print(items) 
      DispatchQueue.main.async { 
       self.tableView.reloadData() 
      } 
     } catch { 
      print("Couldn't fetch data") 
     } 

    } 

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

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as UITableViewCell 

     let date = items.reversed()[indexPath.row].date 

     cell.textLabel?.text = items[indexPath.row].title 

     if let date = date { 
      let dateStamp = "Added on \(date)" 
      cell.detailTextLabel?.text = dateStamp 
     } 

     return cell 
    } 

    @objc(tableView:editActionsForRowAtIndexPath:) func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 

     let delete = UITableViewRowAction(style: .default, title: "Delete") { (action, indexPath) in 
      // delete item at indexPath 
      let item = self.items[indexPath.row] 
      self.context.delete(item) 
      (UIApplication.shared.delegate as! AppDelegate).saveContext() 

      self.items.remove(at: indexPath.row) 
      tableView.deleteRows(at: [indexPath], with: .fade) 

     } 

     return [delete] 

    } 

    public func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){ 

     if (segue.identifier == "showEntry") { 
      // initialize new view controller and cast it as your view controller 
      let viewController = EntryViewController() 
      // your new view controller should have property that will store passed value 
      viewController.passedEntry = passedEntry 
     } 
    } 


    public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

     passedEntry = items[indexPath.row].title! 
     self.performSegue(withIdentifier: "showEntry", sender: self) 

    } 

    override func viewWillAppear(_ animated: Bool) { 

     fetchData() 

    } 

Dies ist der Code auf dem EntryViewController die noch nil druckt:

class EntryViewController: UIViewController { 

    var passedEntry:String! 

    @IBOutlet weak var dreamTitle: UITextView! 
    @IBOutlet weak var dreamPost: UITextView! 
    @IBAction func saveChanges(_ sender: Any) { 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     print(passedEntry) 
    } 

Es tut mir leid für Sein ein Neuling, aber ich brauche etwas detailliertere Anweisungen ...

Antwort

4

Zwei Fragen:

  • Die Signatur von prepareForSegue ist falsch für Swift 3.
  • Nie View-Controller mit der Standard-Initialisierung erstellen, wenn auftritt

Das Hauptproblem in dieser Zeile mit Storyboard :

let viewController = EntryViewController() 

Sie erstellen eine Kleie d neue Instanz von EntryViewController die nicht der Controller im Storyboard ist. Sie haben den destination View-Controller der segue verwenden:

func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "showEntry" { 
     // initialize new view controller and cast it as your view controller 
     let viewController = segue.destination as! EntryViewController 
     // your new view controller should have property that will store passed value 
     let title = items[indexPath.row].title 
     viewController.passedEntry = title 
    } 
    } 

Und ich empfehle die Saite in dem Ziel-View-Controller als nicht optional leere Zeichenfolge statt einer impliziten ungeöffneten optional zu erklären. Nicht optionale Typen werden die App niemals zum Absturz bringen.

var passedEntry = "" 
+0

Vielen Dank, wie ein Zauber funktioniert vorbei! :) –

3

Sie a re definiere prepareForSegue() als lokale Funktion innerhalb der TableView-Funktion. Es wird nicht verwendet. Setzen Sie einen Debugger-Haltepunkt hinein und sehen Sie selbst, ob er erreicht wird.

+0

ich es ersetzt eine öffentliche Funktion zu sein, aber ich kann immer noch nicht auf die Daten bekommen –

Verwandte Themen