将 CoreData 从 UITableViewCell 传递给 viewcontroller

Posted

技术标签:

【中文标题】将 CoreData 从 UITableViewCell 传递给 viewcontroller【英文标题】:passing CoreData from UITableViewCell to viewcontroller 【发布时间】:2019-05-29 23:38:44 【问题描述】:

我正在尝试创建功能,当用户单击 UITableView 中的特定单元格时,项目将转到新的 ViewController 并显示已保存在 CoreData 中的所有信息。问题是当我触摸一个单元格时,我得到一个错误

Unexpected nil while unwrapping optional value

这是我的代码,因为它现在位于具有 TableView 的 ViewController 中

class ContactViewController: UIViewController, UITableViewDataSource, NSFetchedResultsControllerDelegate, UITableViewDelegate 
        var selectName:String?
    var selectPhone:String?
var selectComment:String?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        selectName = contact[indexPath.row].name
        selectPhone = contact[indexPath.row].phone
        selectComment = contact[indexPath.row].comments
        performSegue(withIdentifier: "MySegue", sender: self)
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "MySegue"
            if let destVC = segue.destination as? IndiViewController 
                destVC.NameLabel = selectName
                destVC.PhoneLabel = selectPhone
                destVC.CommentLabel = selectComment
            
        
    

这是我在 IndiViewController 中的代码(我希望用户在其中查看联系人的 VC)

class IndiViewController: UIViewController 


    @IBOutlet var NameLabel: UILabel!
    @IBOutlet var PhoneLabel: UILabel!
    @IBOutlet var CommentsLabel: UILabel!

    override func viewDidLoad() 
        super.viewDidLoad()

    

我尝试了其他几种方法,但仍然出现相同的错误

我做了一些故障排除,看看是哪个变量真正导致了 nil:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "MySegue"
            if let destVC = segue.destination as? IndiViewController 
                destVC.NameLabel = "selectName" //I thought if perhaps the nil was the var selectName this would at least let me know

            
        

但是,即使这样,应用程序也会崩溃并给出相同的错误。所以我认为问题在于 IndiViewController 中的标签。

所以我尝试创建一个空字符串并将其分配给 NameLabel,如下所示:

class IndiViewController: UIViewController 


    @IBOutlet var NameLabel: UILabel!

var name = ""

override func viewDidLoad() 
        super.viewDidLoad()
NameLabel.text = name
    

但还是没有运气。

我做错了什么?

【问题讨论】:

您的NameLabel 插座是否正确链接到您的故事板? @Olympiloutre 是的,我什至重新连接它们只是为了确定 如果 IndiViewController 在没有向其传递数据的情况下自行失败,它看起来像是一个错误的出口引用尝试用 @IBOutlet weak var NameLabel: UILabel? 替换 @IBOutlet var NameLabel: UILabel! 然后在 viewDidLoad print( NameLabel ) 感谢您的输入,但它仍然崩溃并出现错误this class is not key value coding-compliant for the key NameLabel 【参考方案1】:

但它可能是一个 IBOutlet 错误,即使是拼写错误。

    删除@IBOutlet var NameLabel: UILabel! 删除 StoryBoard“参考网点”选项卡中的链接

    单击并拖动UILabel 的新插座,并且不要用大写字母命名它

    // @IBOutlet var NameLabel: UILabel! @IBOutlet var nameLabel: UILabel!

编辑

也尝试分两次传递你的信息:

    在你的destinationViewController中创建一个新的变量:

    class IndiViewController: UIViewController 
    
        @IBOutlet var nameLabel: UILabel!
    
        var myText: String = ""
    
        override func viewDidLoad() 
            super.viewDidLoad()
            nameLabel.text = myText // assign the var to the labels text
        
    

    在您的 prepareForSegue 方法中分配 myText 而不是 nameLabel.text

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "MySegue"
            if let destVC = segue.destination as? IndiViewController 
                destVC.myText = "selectName" 
            
        
    
    

我的猜测是您无法在 prepare(for segue:) 方法中访问 IBOutlets。目标 ViewController 尚未构建

【讨论】:

当我使用这种方法时,我第一次尝试像这样destVC.nameLabel?.text = selectName 并没有崩溃,但是标签都没有真正改变,他们都只是说'标签'。然后,当我从 destVC.nameLabel.text = selectName 等代码中删除 ? 时,应用程序崩溃并声称 Unexpectedly found nil while implicitly unwrapping an Optional value @TariqKhan 只是编辑我的帖子,试试这个方法。不太确定您是否可以在 prepareForSegue 方法中访问目的地的 Outlets。 啊是的,这正是我所缺少的!现在它可以工作了。非常感谢你。我认为问题在于 nameLabel 需要事先初始化。这成功了 不错!也尽量不要把出口(一般是 var )大写字母

以上是关于将 CoreData 从 UITableViewCell 传递给 viewcontroller的主要内容,如果未能解决你的问题,请参考以下文章

将 NSData 数组保存到 CoreData

CoreData:从捆绑的数据库中迁移数据

如何最好地将应用程序从 sqlite(使用 fmdb)迁移到 CoreData?

RestKit + CoreData:从CoreData缓存中排除某些对象

SwiftUI 使用 CoreData 从列表中编辑项目

从 CoreData 检索 NSImage - Mac OS X