Swift - Unwind segue 传回 nil 值?

Swift - Unwind segue passes back nil value?

我有两个视图控制器。第二个视图控制器托管一个 table 视图,其中包含一个自定义单元格,该单元格展开回第一个视图控制器并发回与该单元格关联的数据。

在第二个视图控制器 class 中,我实现了 didSelectRowAtIndexPath 并进行了测试以查看 class 属性 中是否存储了正确的项目。它正确地存储了可选值,但是当我尝试在第一个视图控制器中使用该值时,属性 将 nil 打印到控制台。

// First view controller

@IBAction func unwindActivitiesVCCellTapped( segue: UIStoryboardSegue )
{
    // table view cell tapped

    guard let activitiesVC = segue.sourceViewController as? ActivitiesVC else { return }

    print(activitiesVC.activityPerforming) // Displays nil in console output

    if let activityPerforming = activitiesVC.activityPerforming // thus this does not get called
    {
        activityPerformingButton.titleLabel?.text = activityPerforming
    }
}

// Second View Controller

class ActivitiesVC: UIViewController 
{
    @IBOutlet weak var activitiesTableView: UITableView!

    let activityTitles = [ "Walk" , "Run ", "Cycle", "Mountain Bike" ]

    var activityPerforming: String?

    override func viewDidLoad()
    {
        super.viewDidLoad()

        activitiesTableView.dataSource = self
        activitiesTableView.delegate   = self
    }
}

extension ActivitiesVC: UITableViewDelegate
{
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {
        activityPerforming = activityTitles[ indexPath.row ]
        print(activityPerfoming) // displays optional value I want
    }
}

// Custom Cell

class ActivityCell: UITableViewCell
{

    @IBOutlet weak var imageLabel    : UILabel!
    @IBOutlet weak var activityLabel : UILabel!

    override func awakeFromNib()
    {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool)
    {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}

属性 显示为 nil 的原因是什么?我该如何补救这种情况?

我怀疑你的 unwind segue 直接连接到你的 UITableViewCell 所以它在调用 didSelectRowAtIndexPath 之前被触发。

要解决此问题,请将 didSelectRowAtIndexPath 中的代码移至 prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let indexPath = activitiesTableView.indexPathForSelectedRow {
        activityPerforming = activityTitles[ indexPath.row ]
        print(activityPerfoming) // displays optional value I want
    }
}