首页 > 解决方案 > 第二个控制器没有接收到数据

问题描述

我有两个控制器,我试图将数据从第一个传递到第二个,但它根本没有接收到。我尝试将数据作为属性传递并使用 prepareForSegue,但不知何故,第二个视图控制器没有从第一个控制器接收值。第一个 Controller 称为MainViewController,第二个是FactViewController。我在下面使用这个扩展,因为我在我的第一个屏幕中使用了 contentView。当我从内容视图中点击一个单元格时,我想执行数据传输。factValue常量正常接收我想要的数据,但是当我将其传输到第二个控制器(FactViewController)时,它不会传输。

使用财产方式:

extension MainViewController: UICollectionViewDelegate {
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        let factValue = facts!.result[indexPath.row].value
        let fvc = FactViewController()

        fvc.receivedValue = factValue

        performSegue(withIdentifier: "segueMainscAndFactsc", sender: nil)
}

使用 Prepreforsegue 方式:

extension MainViewController: UICollectionViewDelegate {
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        let factValue = facts!.result[indexPath.row].value
        
        func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
            
            let destinationVC = segue.destination as! FactViewController
            destinationVC.receivedValue = factValue
        }
    }
}

这是我的第二个视图控制器(FactViewController):

class FactViewController: UIViewController {

    var receivedValue: String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        print(receivedValue)
    }  
}

receivedValue当我在里面的第二个控制器中打印变量时,viewDidLoad它仍然打印一个空的String. 有没有人有解决它的建议?

标签: swiftsegue

解决方案


嗯,第一种方式很明显是无效的。你说let fvc = FactViewController()并设置了它receivedValue,但是你把它扔掉了,而是触发了一个涉及完全不同的FactViewController 的 segue。因此,您设置的那个receivedValue不是其视图被加载的那个。

第二种方法也是无效的,因为你prepareForSegue被埋在另一个函数中(并且签名错误),所以它甚至不会被调用。

你真正想要的更像是这样的:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    performSegue(withIdentifier: "segueMainscAndFactsc", sender: nil)
}

func prepare(for segue: UIStoryboardSegue, sender: Any?)  {
    let destinationVC = segue.destination as! FactViewController
    let factValue = // ???
    destinationVC.receivedValue = factValue
}

请注意,我已经更正了您的prepare签名。

这里的困难部分是弄清楚factValue应该是什么。但就目前而言,只需设置一些任意值来说服自己这行得通!然后,您可以努力获取正确的值以移交给目标 vc。


推荐阅读