将CoreData密钥传递给新的ViewController

伊森·T

我正在开发我的应用程序的一部分,该部分将充当用户的日记,他们可以在其中添加条目,然后再查看或删除它们。我遵循了一些有关CoreData的Swift教程,并且已经确认CoreData设置可以正常工作。但是,我在获取值传递给UIViewController已经保存后将显示日记的值时遇到了麻烦在一种配置中,我尝试不显示任何数据,在另一种配置中,无论选择什么条目,数据都将保持不变,并且在下面的设置中,此行journalEntryViewer.journalViewerTextView.text = journalTextToPass返回“解开可选值时发现nil”。以下是UITableViewController充当列表的代码

import UIKit
import CoreData

class JournalCollectionViewer: UITableViewController {
    var JournalEntry = [NSManagedObject]()
    var journalTextToPass:String!
    var journalTitleToPass:String!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.reloadData()
    }
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true)
    self.tableView.reloadData()
    let appDelegate =
        UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let fetchRequest = NSFetchRequest(entityName: "JournalEntry")
    do {
        let results =
            try managedContext.executeFetchRequest(fetchRequest)

        JournalEntry = results as! [NSManagedObject]
    } catch let error as NSError {
        print("Could not fetch \(error), \(error.userInfo)")
    }
}
// MARK: - Table view data source

@IBOutlet weak internal var journalCollectionTable: UITableView!


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return JournalEntry.count
}
override func tableView(tableView: UITableView,
               cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell =
        tableView.dequeueReusableCellWithIdentifier("JournalCell")

    let entry = JournalEntry[indexPath.row]

    cell!.textLabel!.text =
        entry.valueForKey("journalDate") as? String
    return cell!
}
    func selectedTableCell(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let entry = self.JournalEntry[indexPath.row]

    self.performSegueWithIdentifier("ShowEntryViewer", sender: entry)
}
// MARK: - Navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "ShowEntryViewer" {
        let journalEntryViewer = segue.destinationViewController as! JournalEntryViewer
        journalEntryViewer.self.navigationItem.title = journalTitleToPass
        journalEntryViewer.journalViewerTextView.text = journalTextToPass
    }
}
}

在查看器的Swift文件(journalEntryViewer)中,我所做的全部是声明类和UITextView。不用说,我很茫然。任何帮助表示赞赏!

尼拉夫D

当您将值分配给该IBOutlet对象中的prepareForSegue那个时候没有初始化,所以你需要通过字符串对象,并指定该字符串对象的方法journalViewerTextViewviewDidLoadJournalEntryViewer

首先JournalEntryViewer像这样声明两个实例var

var journalTitle: String?
var journalText: String?

现在在 viewDidload

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.title = journalTitle
    self.journalViewerTextView.text = journalTitle
}

现在把这个journalTitlejournalTextprepareForSegue方法JournalCollectionViewer

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "ShowEntryViewer" {
        let journalEntryViewer = segue.destinationViewController as! JournalEntryViewer
        journalEntryViewer.journalTitle = journalTitleToPass
        journalEntryViewer.journalText = journalTextToPass
    }
}

新编辑:

代码问题是您没有使用委托方法,didSelectRowAtIndexPath而是使用了其他selectedTableCell错误的方法,请尝试实现UITableView的委托方法

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let entry = self.JournalEntry[indexPath.row]
    self.performSegueWithIdentifier("ShowEntryViewer", sender: entry)
}

现在您正在传递入口对象,所以prepareForSegue这样更改您的

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "ShowEntryViewer" {
        let journalEntryViewer = segue.destinationViewController as! JournalEntryViewer
        let entry = sender as! NSManagedObject
        journalEntryViewer.journalTitle = entry.valueForKey("journalDate") as? String
        journalEntryViewer.journalText = entry.valueForKey("journalEntryText") as? String
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章