swift 调用dismiss方法后,如何正确重新加载UIViewController?

exdqitrt  于 2022-12-02  发布在  Swift
关注(0)|答案(3)|浏览(209)

我有两个viewController,分别名为vcA和vcB。vcA有navigationController,而vcB只是viewController,没有navigationController。我将文本数据保存在vcB的一个文件中,我希望在调用dismiss方法后返回vcA时在vcA中显示文本。我认为在调用dismiss后重新加载vcA是显示文本的正确方式,但我发现在vcA和vcB之间这样做可能比较困难,因为vcA有navigationController,而vcB没有navigationController。

e0bqpujr

e0bqpujr1#

你可以用self.present代替self.dissifs,就像这样:
设vc = vcA()

  • 在这里您可以传递数据。例如,如果vcA()有一个名为text的var,它是一个字符串,您可以使用vc.text =“something”。此数据将与self.present方法一起传递 *

VC.模式演示文稿样式= .全屏
自我呈现(VC,动画:false,完成:无)

svdrlsy4

svdrlsy42#

您可以使用protocol/delegate模式将值传回给呈现视图控制器。以下是一个示例,说明如何将vcB中的文本字段中的文本传递给vcA,因为vcB正在被解除,所以您可以用要传递的值来替换它。

protocol ValuePassingDelegate {
    func didPassValue(of text: String)
}

class ViewControllerA: UIViewController, ValuePassingDelegate {
    let label = UILabel(frame: CGRect(origin: CGPoint(x: 0, y: 100), size: CGSize(width: 200, height: 100)))
    let button = UIButton(type: .system)
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(label)
        label.text = "Initial text"
        label.textAlignment = .center
        
        button.frame = CGRect(origin: CGPoint(x: 0, y: 300), size: CGSize(width: 200, height: 100))
        button.setTitle("Button", for: .normal)
        button.addTarget(self, action: #selector(buttonHandler), for: .touchUpInside)
        view.addSubview(button)
    }
    
    @objc func buttonHandler() {
        let vcB = ViewControllerB()
        vcB.delegate = self
        self.navigationController?.pushViewController(vcB, animated: true)
    }
    
    func didPassValue(of text: String) {
        DispatchQueue.main.async {
            self.label.text = text
        }
    }
}

class ViewControllerB: UIViewController {
    let textField = UITextField(frame: CGRect(origin: .zero, size: CGSize(width: 200, height: 100)))
    var delegate: ValuePassingDelegate?
    override func viewDidLoad() {
        super.viewDidLoad()
        textField.layer.borderWidth = 1
        textField.layer.borderColor = UIColor.black.cgColor
        view.addSubview(textField)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        delegate?.didPassValue(of: textField.text ?? "")
    }
}
7ivaypg9

7ivaypg93#

为此我遵循的方法是:
在vcB中,我添加了:internal var senderVC: UIViewController?
在vcA中,我添加了:vcB.senderVC = self
在vcB中,我添加了:if let firstVC = self.senderVC as? vcA { firstVC.tableView.reloadData(); }

相关问题