Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将CoreData从UITableViewCell传递到viewcontroller_Swift_Xcode_Uitableview_Core Data_Viewcontroller - Fatal编程技术网

Swift 将CoreData从UITableViewCell传递到viewcontroller

Swift 将CoreData从UITableViewCell传递到viewcontroller,swift,xcode,uitableview,core-data,viewcontroller,Swift,Xcode,Uitableview,Core Data,Viewcontroller,我正在尝试创建一个功能,当用户单击我的UITableView中的特定单元格时,项目将切换到一个新的ViewController,并显示保存在CoreData中的所有信息。问题是,当我触摸一个电池时,我会得到一个错误 Unexpected nil while unwrapping optional value 下面是我的代码,它现在位于具有TableView的ViewController中 class ContactViewController: UIViewController, UITabl

我正在尝试创建一个功能,当用户单击我的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
            }
        }
    }
这是我在IndividualWController(我希望用户在其中查看联系人的VC)中的代码

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

我进行了一些故障排除,以查看哪个变量真正导致了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

            }
        }
然而,即使这样,应用程序也会崩溃并出现同样的错误。所以我认为问题在于IndividualWController中的标签

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

class IndiViewController: UIViewController {


    @IBOutlet var NameLabel: UILabel!

var name = ""

override func viewDidLoad() {
        super.viewDidLoad()
NameLabel.text = name
    }
}
但还是没有运气


我做错了什么?

但这可能是一个IBOutlet错误,即使是打字错误

  • 删除
    @IBOutlet var namelab:UILabel
  • 删除情节提要“引用插座”选项卡中的链接
  • 单击并拖动
    ui标签的新插座,并且不要用大写字母命名

    /@IBOutlet var namelab:UILabel
    @IBOutlet var名称标签:UILabel

  • 编辑

    同时,尝试两次传递您的信息:

  • 在destinationViewController中创建新的var,如下所示:

    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
    ,而不是
    namelab.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尚未构建

    ,但它可能是一个IBOutlet错误,即使是打字错误

  • 删除
    @IBOutlet var namelab:UILabel
  • 删除情节提要“引用插座”选项卡中的链接
  • 单击并拖动
    ui标签的新插座,并且不要用大写字母命名

    /@IBOutlet var namelab:UILabel
    @IBOutlet var名称标签:UILabel

  • 编辑

    同时,尝试两次传递您的信息:

  • 在destinationViewController中创建新的var,如下所示:

    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
    ,而不是
    namelab.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尚未构建

    您的
    名称标签
    插座是否正确链接到您的故事板?@Olympilotre是的,我甚至重新连接了它们,只是为了确保
    个人控制器
    在未向其传递数据的情况下自行失败,它看起来很像是一个错误的出口引用,请尝试替换
    @IBOutlet var namelab:UILabel@ibvar-name-label:UILabel?
    编码>然后在viewDidLoad
    打印(name-label)
    感谢您的输入,但是它仍然会崩溃,错误是
    该类不符合密钥名称标签的键值编码
    您的
    名称标签
    插座是否正确链接到您的故事板?@Olympilotre是的,我甚至重新连接了它们,只是为了确保
    IndividualWController
    本身没有向其传递数据就失败了,它看起来很像是一个错误的出口引用,请尝试替换
    @IBOutlet var namelab:UILabel@ibvar-name-label:UILabel?
    编码>然后在viewDidLoad
    打印(name-label)
    感谢您的输入,但是它仍然会崩溃,错误是
    这个类不符合键值编码的键值名称标签
    当我使用这个方法时,我第一次尝试这样做
    destVC.namelab?.text=selectName
    ,它没有崩溃,但是没有任何标签真正被更改,它们都只是说“标签”。然后,当我从代码中删除
    ,例如
    destVC.namelab.text=selectName
    时,应用程序在隐式展开可选值时意外发现了nil
    @TariqKhan只需编辑我的帖子,请尝试此方法。不太确定您是否可以使用prepareForSegue方法访问目的地的门店。啊,是的,这正是我所缺少的!现在它起作用了。非常感谢你。我认为问题在于,
    namelab
    需要先初始化。这就是特里克尼斯!另外,尽量不要将outlet(var)放在大写字母中当我使用这个方法时,我第一次尝试这样做
    destVC.nameLabel?.text=selectName
    ,它没有崩溃,但是没有任何标签真正改变,它们都只是说“标签”。然后,当我从代码中删除
    ,例如
    destVC.namelab.text=selectName
    时,应用程序在隐式展开可选值时意外发现了nil
    @TariqKhan只需编辑我的帖子,请尝试此方法。不太确定您是否可以使用prepareForSegue方法访问目的地的门店。啊,是的,这正是我所缺少的!现在它起作用了。非常感谢你。我认为问题在于,
    namelab
    需要先初始化。这就是特里克尼斯!此外,尽量不要将outlet(var)放在大写字母中