我正试图将用户在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/