从UITableViewCell传递CoreData到viewcontroller

时间:2019-05-29 23:38:45

标签: 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()

    }
}

我尝试了其他几种方法,但是所有方法仍然存在相同的错误

我对此进行了一些故障排除,以查看哪个变量确实导致了无效:

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中的标签。

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

class IndiViewController: UIViewController {


    @IBOutlet var NameLabel: UILabel!

var name = ""

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

但仍然没有运气。

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

即使对于拼写错误,也可能是IBOutlet错误。

  1. 删除@IBOutlet var NameLabel: UILabel!
  2. 删除StoryBoard“参考出口”标签中的链接
  3. 单击并拖动UILabel的新插座,并且不要用大写字母命名

    // @IBOutlet var NameLabel: UILabel!
    @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