使用关闭将变量信息传递给第一个VC的麻烦

问题描述 投票:0回答:1

我试图将我的ShipViewController中用户选择的名称的数据传递给我的ProfileViewController。我尝试使用闭包这样做,但ProfileViewController中的按钮标题(向ShipViewController呈现模态弹出窗口)不会更改为用户在ShipViewController中选择的名称。

它应该不是String - >()还是我实例化视图控制器的方式不正确?

(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)
    }
swift variables closures viewcontroller instantiation
1个回答
1
投票

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)
             }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.