如何将showSubViewInContainerView的parms参数赋值给ConceptGalleryView的idGallery
解决ViewController间参数传递的问题
嘿,我来帮你搞定把parms参数传给对应ViewController属性的需求~
首先,咱们先梳理下你的现有逻辑:你通过showSubViewInContainerView函数实例化不同的ViewController并添加到容器中,现在要把parms传递给目标控制器的特定属性(比如ConceptGalleryView的idGallery)。下面给你两种可行的实现方式:
方法一:针对特定控制器直接赋值
这是最直接的方式,在实例化控制器后,判断它的类型,转换后直接给对应属性赋值。修改你的showSubViewInContainerView函数如下:
var actualVisibleView : String? = nil func showSubViewInContainerView(view: String, parms: String?){ let controller = storyboard!.instantiateViewController(withIdentifier: view) // 新增参数传递逻辑:针对ConceptGalleryView赋值 if let conceptGalleryVC = controller as? ConceptGalleryView, let parmsStr = parms, let id = Int(parmsStr) { conceptGalleryVC.idGallery = id } // 如果还有其他需要传参的控制器,可继续添加类似判断 // else if let view1VC = controller as? View1, let parmsStr = parms { // view1VC.targetProperty = parmsStr // } systemContainerView.subviews.forEach { $0.removeFromSuperview() } addChildViewController(controller) controller.view.translatesAutoresizingMaskIntoConstraints = false systemContainerView.addSubview(controller.view) NSLayoutConstraint.activate([ controller.view.leadingAnchor.constraint(equalTo: systemContainerView.leadingAnchor), controller.view.trailingAnchor.constraint(equalTo: systemContainerView.trailingAnchor), controller.view.topAnchor.constraint(equalTo: systemContainerView.topAnchor), controller.view.bottomAnchor.constraint(equalTo: systemContainerView.bottomAnchor) ]) controller.didMove(toParentViewController: self) self.actualVisibleView = view print("OPEN: \(view)") }
这样当你调用showSubViewInContainerView(view: "ConceptGalleryView", parms: "1")时,ConceptGalleryView的idGallery就会被赋值为1啦。
方法二:用协议统一处理参数传递(更优雅的扩展方案)
如果以后有更多ViewController需要接收parms参数,用协议规范会更简洁,避免写一堆if-else判断:
- 先定义一个统一处理参数的协议:
protocol ParameterReceivable { func setParameters(_ parms: String?) }
- 让需要接收参数的ViewController遵守该协议,比如
ConceptGalleryView:
class ConceptGalleryView: UIViewController, ParameterReceivable { var idGallery = 0 override func viewDidLoad() { super.viewDidLoad() } func setParameters(_ parms: String?) { if let parmsStr = parms, let id = Int(parmsStr) { idGallery = id } } }
- 修改
showSubViewInContainerView函数,一行代码统一处理参数传递:
var actualVisibleView : String? = nil func showSubViewInContainerView(view: String, parms: String?){ let controller = storyboard!.instantiateViewController(withIdentifier: view) // 统一处理参数传递,兼容所有遵守协议的控制器 (controller as? ParameterReceivable)?.setParameters(parms) systemContainerView.subviews.forEach { $0.removeFromSuperview() } addChildViewController(controller) controller.view.translatesAutoresizingMaskIntoConstraints = false systemContainerView.addSubview(controller.view) NSLayoutConstraint.activate([ controller.view.leadingAnchor.constraint(equalTo: systemContainerView.leadingAnchor), controller.view.trailingAnchor.constraint(equalTo: systemContainerView.trailingAnchor), controller.view.topAnchor.constraint(equalTo: systemContainerView.topAnchor), controller.view.bottomAnchor.constraint(equalTo: systemContainerView.bottomAnchor) ]) controller.didMove(toParentViewController: self) self.actualVisibleView = view print("OPEN: \(view)") }
这种方式扩展性更强,以后新增ViewController时,只需要让它遵守ParameterReceivable协议并实现setParameters方法即可,无需修改showSubViewInContainerView函数。
另外,我帮你去掉了原代码中重复调用的systemContainerView.addSubview(controller.view),避免冗余操作~
内容的提问来源于stack exchange,提问作者triff
相关产品推荐
相关产品推荐

