我正试图将用户在myShipViewController中选择的名称的数据传递给myProfileViewController。我尝试使用闭包来实现这一点,但是ProfileViewController中的按钮标题(它将模式popover显示为ShipViewController)并没有更改为用户在ShipViewController中选择的名称。
它应该不是字符串-->()还是我实例化视图控制器的方式不正确?

(ShipViewController)

var completionHandler:((String) -> ())?

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "shipCell", for: indexPath) as! ShipViewCell

    if selectedIndex == indexPath.row {
        let result = completionHandler?(shipNames[selectedIndex!])
        self.dismiss(animated: true, completion: nil)
    }
}

(In viewDidLoad of ProfileViewController)
        let vc = storyboard?.instantiateViewController(withIdentifier: "ShipViewController") as! ShipViewController
    vc.completionHandler = { (text) -> ()in
        print(text)
        self.shipButton.setTitle(text, for: .normal)
    }

最佳答案

解除ShipViewController中的didSelectItemAt

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let result = completionHandler?(shipNames[indexPath.item])
        self.dismiss(animated: true, completion: nil)
}

ProfileViewController中不分配给viewDidLoad中的completionHandler
分配给prepare for segue中的完成处理程序
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showShip" {
        if let vc = segue.destination as? ShipViewController {
             vc.completionHandler = { (text) -> ()in
                  print(text)
                  self.shipButton.setTitle(text, for: .normal)
             }
        }
    }
}

关于swift - 使用闭包将变量信息传递给第一个VC时出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55349677/

10-09 06:48