swift - 将 CoreData 从 UITableViewCell 传递到 View Controller

标签 swift xcode uitableview core-data 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 错误,即使是拼写错误。

  1. 删除@IBOutlet var NameLabel: UILabel!
  2. 删除 StoryBoard“referencing outlets”选项卡中的链接
  3. 点击拖拽一个新的导出给 UILabel并且不要用大写字母命名

    // @IBOutlet var NameLabel: UILabel!<br/> @IBOutlet var nameLabel: UILabel!

编辑

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

  1. 在您的 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
        }
    

  2. 在您的 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 尚未构建

关于swift - 将 CoreData 从 UITableViewCell 传递到 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56369847/

相关文章:

xcode - 找不到Xcode音频组件符号,并且某种程度上无法使用方法

ios - 当我在表格 View 中选择一个单元格时,我的应用程序崩溃了,但我找不到它崩溃的代码位置

iphone - 滚动时 UITableView 未正确更新

Xcode Instruments 给出此错误 "Could not start script, target application is not frontmost."

ios - 从日期范围创建日期字符串数组

swift - tableView.cellForRowAtIndexPath(indexPath) 返回 nil

swift - 具有不同内容的表格 View 单元格

swift - 出现 fatal error "JVP does not exist. Differential-first differentiation APIs are experimental and should not be used."

ios - 我可以在两个 UITableViewCell 之间构建一个 UITableView 吗?

ios - 如何在 Swift 4 中使用启动屏幕或图像来阻止 secret 信息?