如何从父ViewController关闭formSheet模态框并获取内容执行Segue
解决方案:用闭包实现模态视图与父视图的通信
这是iOS开发里实现模态视图向父视图传递数据最简洁直观的方案,我给你一步步拆解实现步骤:
1. 给SummaryViewController添加闭包回调属性
在你的SummaryViewController类里新增一个闭包属性,用来把输入的文本传递回父视图:
import UIKit class SummaryViewController: UIViewController, UITextViewDelegate { @IBOutlet weak var summaryTV: UITextView! // 新增闭包属性,用于回调文本内容 var onSaveSummary: ((String?) -> Void)? override func viewDidLoad() { super.viewDidLoad() summaryTV.delegate = self summaryTV.textColor = UIColor.lightGray summaryTV.text = "Escriba el resumen de la visita" } // ... 原有其他代码保持不变 ... @IBAction func saveSummary(_ sender: Any) { // 处理占位符情况:如果是灰色提示文本,就返回nil,否则返回输入内容 let inputText = summaryTV.textColor == .lightGray ? nil : summaryTV.text // 调用闭包,把文本传递给父视图 onSaveSummary?(inputText) // 关闭模态视图 self.dismiss(animated: true) } }
2. 修改父视图的模态弹出代码,处理回调
在你弹出模态视图的代码中,给summary的闭包赋值,拿到返回的文本后执行Segue跳转:
let summary = SummaryViewController(nibName: "SummaryViewController", bundle: nil) summary.preferredContentSize = CGSize(width: 800, height: 300) summary.modalPresentationStyle = UIModalPresentationStyle.formSheet // 设置闭包,接收模态视图返回的文本 summary.onSaveSummary = { [weak self] text in guard let self = self else { return } // 这里可以把文本存到父视图的属性里,供后续使用 // self.storedSummaryText = text // 模态框关闭后执行Segue跳转 self.performSegue(withIdentifier: "你的Segue标识符", sender: text) } self.present(summary, animated: true, completion: nil)
额外优化:Segue传递文本到目标页面
如果需要把拿到的文本传递给Segue跳转后的视图控制器,可以在prepare(for:sender:)里处理:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "你的Segue标识符" { // 替换成你的目标视图控制器类型 if let targetVC = segue.destination as? TargetViewController, let summaryText = sender as? String { targetVC.receivedSummaryText = summaryText } } }
注意:用[weak self]是为了避免循环引用导致内存泄漏,这是iOS开发的最佳实践哦。
内容的提问来源于stack exchange,提问作者user5250550
相关产品推荐
相关产品推荐

