Swift - Unwind segue 传回零值?

标签 swift uitableview uiviewcontroller unwind-segue pass-data

我有两个 View Controller 。第二个 View Controller 承载一个带有自定义单元格的 TableView ,该单元格展开回第一个 View Controller 并发回与该单元格关联的数据。

在第二个 View Controller 类中,我实现了 didSelectRowAtIndexPath 并进行了测试以查看正确的项目是否存储在类属性中。它正确地存储了可选值,但是当我尝试在第一个 View Controller 中使用该值时,该属性将 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
    }
}

关于Swift - Unwind segue 传回零值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38935949/

相关文章:

ios - 从 App Delegate 调用 ViewController 方法

ios - iPhone 7 Plus 背景图片大小

objective-c - UITableViewCell 中的 UIGestureRecognizer

ios - 异步加载图像到自定义 UITableViewCell 部分工作

ios - 更新 CoreData 对象无法正常工作

ios - 如果我知道用户很可能很快会选择 View Controller ,我该如何提前加载它?

swift - 如何快速消除 View ? missViewControllerAnimated 没有做任何事情?

ios - 我什么时候应该在闭包中使用捕获列表,什么时候使用弱与无主?

ios - Xcode 6 : attribute error when compiling a NSManagedObject class

iOS - 将累积数据传递到一长串 UIViewControllers