将 CoreData 从 UITableViewCell 传递到 viewcontroller
passing CoreData from UITableViewCell to viewcontroller
我正在尝试创建这样的功能,当用户单击我的 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
}
}
但还是没有运气。
我做错了什么?
然而它可能是一个 IBOutlet 错误,即使是拼写错误。
- 删除
@IBOutlet var NameLabel: UILabel!
- 删除 StoryBoard "referencing outlets" 选项卡中的 link
click-drag UILabel
和 的新出口不要用大写字母命名
// @IBOutlet var NameLabel: UILabel!<br>
@IBOutlet var nameLabel: UILabel!
编辑
也尝试分两次传递您的信息:
在您的目的地创建一个新变量ViewController,例如:
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 尚未建成
我正在尝试创建这样的功能,当用户单击我的 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
}
}
但还是没有运气。
我做错了什么?
然而它可能是一个 IBOutlet 错误,即使是拼写错误。
- 删除
@IBOutlet var NameLabel: UILabel!
- 删除 StoryBoard "referencing outlets" 选项卡中的 link
click-drag
UILabel
和 的新出口不要用大写字母命名// @IBOutlet var NameLabel: UILabel!<br> @IBOutlet var nameLabel: UILabel!
编辑
也尝试分两次传递您的信息:
在您的目的地创建一个新变量ViewController,例如:
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 尚未建成