将 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的主要内容,如果未能解决你的问题,请参考以下文章
如何最好地将应用程序从 sqlite(使用 fmdb)迁移到 CoreData?