2017-06-15 2 views
0

Ich erhalte den folgenden Fehler, nachdem ich Daten von einem ViewController an einen anderen übergeben habe.Fehler beim Übertragen von Daten zwischen zwei ViewControllern

no data 
eventStruct(title: What are we gonna do today?, date: 2017-07-13, location: House3, description: Hello beautiful people!) 
2017-06-15 22:01:05.697 RUC-App 1.0[48760:5792168] Warning: Attempt to present <RUC_App_1_0.EventViewController: 0x7fb686636460> on <RUC_App_1_0.NewsfeedViewController: 0x7fb68662e6a0> whose view is not in the window hierarchy! 

Der Code von der ersten ViewController:

import UIKit 
import Firebase 
import FirebaseAuth 
import FirebaseDatabase 

class NewsfeedViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var ref:DatabaseReference!, 
     posts = [eventStruct]() 
    @IBOutlet weak var tableview: UITableView! 
    var propertStruct : (Any)? = nil 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     loadNews() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func loadNews() { 
     ref = Database.database().reference() 
     ref.child("events").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in 

      if let valueDictionary = snapshot.value as? [AnyHashable:String] 
      { 
       let title = valueDictionary["Title"] 
       let location = valueDictionary["Location"] 
       let date = valueDictionary["Date"] 
       let description = valueDictionary["Description"] 
       self.posts.insert(eventStruct(title: title, date: date, location: location, description: description), at: 0) 
       self.tableview.reloadData() 
      } 
     }) 
    } 

    /////////////////////////  Table View Content  \\\\\\\\\\\\\\\\\\\\\\\\\\ 
    func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
     let label1 = cell.viewWithTag(1) as! UILabel 
     label1.text = posts[indexPath.row].title 
     let label2 = cell.viewWithTag(2) as! UILabel 
     label2.text = posts[indexPath.row].location 
     let label3 = cell.viewWithTag(3) as! UILabel 
     label3.text = posts[indexPath.row].date 
     return cell 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if (segue.identifier == "showDetails"){ 
      let secondViewController = segue.destination as? EventViewController 
      secondViewController?.data = sender as? eventStruct 
     } 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     performSegue(withIdentifier: "showDetails", sender: posts[indexPath.row]) 
    } 
    /////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 
} 

struct eventStruct { 
    let title: String! 
    let date: String! 
    let location: String! 
    let description: String! 

} 

Der Code des zweiten ViewController:

import UIKit 

class EventViewController: UIViewController { 

    var data: eventStruct? 
    @IBOutlet weak var titleLabel: UILabel! 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     print (data ?? "no data") 
     self.titleLabel.text = self.data?.title 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 
+0

Bitte benutzen Sie die 'verbinden showDetails' zu Ihrem tableviewcell segue * und * du bist Aufruf direkt in 'didSelectRowAt'? – DonMag

+0

Ja. So habe ich es gemacht. –

Antwort

2

Sie sollten nicht beide haben ausgelöst und manuelle segues am gleichen geschieht Zeit.

Versuchen Sie folgendes:

löschen Ihre didSelectRowAt Funktion (oder kommentieren Sie sie aus), und ersetzen prepare() mit:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if (segue.identifier == "showDetails"){ 
     let secondViewController = segue.destination as? EventViewController 
     if let idx = tableView.indexPathForSelectedRow { 
      secondViewController?.data = posts[idx.row] 
     } 
    } 
} 
+0

Das behebt das Problem. Vielen Dank! –

Verwandte Themen