2017-04-26 53 views
0

我正在处理日记应用程序,现在我希望人们能够点击单元格/条目,然后转到更详细的视图,以便他们可以读取/编辑条目。事情是,我想传递给下一个视图的字符串没有通过。未在Swift中传递的数据

编辑:

这是对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() 

    } 

这是对EntryViewController的代码仍然打印零:

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) 
    } 

我为是遗憾一个新手,但我需要一些更详细的说明...

回答

4

两个问题:

  • prepareForSegue签名是错误的斯威夫特3
  • 用故事板时使用默认初始化从不创建视图控制器

在此行中会出现此主要问题:

let viewController = EntryViewController() 

您正在创建麸皮d新实例EntryViewController这是而不是故事板中的控制器。您必须使用seguedestination视图控制器:

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 
    } 
    } 

我推荐申报的目的地视图控制器作为非可选空字符串的字符串,而不是一个隐含的展开可选。非可选类型永远不会崩溃应用程序。

var passedEntry = "" 
+0

非常感谢,作品像魅力! :) –

3

你一个重新定义prepareForSegue()作为tableView函数内的本地函数。它不会被使用。把一个调试器断点放进去,看看它是否会到达。

+0

我把它取代为公共功能,但我仍然无法获得数据通过 –

相关问题