iOS开发:如何将数据从MXScrollView传递到子视图控制器
解决MXScrollView向子视图控制器传递数据的问题
我来帮你搞定这个数据传递的事儿,其实逻辑很简单,就是分两步走:先把数据传到MXScrollViewController,再由它把数据接力给子控制器MarkerInfoTabViewController。下面是具体的实现步骤:
1. 给MXScrollViewController添加数据接收属性
首先,你需要在MXScrollViewController里添加一个和子控制器类型一致的marker属性,用来接收从PreviousViewController传过来的数据,然后再转递给子控制器。
class MXScrollViewController: UIViewController { // 添加marker属性,类型和子控制器保持一致 var marker: Marker! override func viewDidLoad() { super.viewDidLoad() // 找到子控制器MarkerInfoTabViewController的实例 if let markerTabVC = self.childViewControllers.first(where: { $0 is MarkerInfoTabViewController }) as? MarkerInfoTabViewController { // 将传递过来的marker赋值给子控制器的marker属性 markerTabVC.marker = self.marker } } }
2. 在PreviousViewController中传递数据到MXScrollViewController
修改你跳转页面的代码,在push之前把要传递的marker对象赋值给MXScrollViewController的属性:
class PreviousViewController:UIViewController { ... @IBAction func goMXScrollView(_ sender: Any) { let nextView = self.storyboard?.instantiateViewController(withIdentifier: "MXScrollViewController") as! MXScrollViewController // 这里替换成你实际要传递的marker对象 nextView.marker = yourTargetMarker self.navigationController?.pushViewController(nextView, animated: true) } }
3. 确保MarkerInfoTabViewController正常接收并传递数据
你原来在MarkerInfoTabViewController里的代码已经写了把marker传递给它的子控制器(leftView和rightView),只要marker属性被正确赋值,这部分就能正常工作。如果需要的话,也别忘了给rightView赋值:
override func viewDidLoad() { super.viewDidLoad() let leftView = self.storyboard?.instantiateViewController(withIdentifier: "MarkerInfoLeftViewController") as! MarkerInfoLeftViewController let rightView = self.storyboard?.instantiateViewController(withIdentifier: "MarkerInfoRightViewController") as! MarkerInfoRightViewController // 这里的marker已经从MXScrollViewController传过来了 leftView.marker = marker rightView.marker = marker // 可选:如果rightView也需要这个数据的话 viewControllers = [leftView, rightView] self.dataSource = self // 创建bar let bar = TMBar.ButtonBar() bar.layout.transitionStyle = .snap // 自定义设置 // 添加到视图 addBar(bar, dataSource: self, at: .top) }
补充说明
- 如果你的
MXScrollViewController是通过代码手动创建MarkerInfoTabViewController,那可以在创建子控制器的时候直接赋值marker属性,不用通过childViewControllers查找,这样更直接。 - 确保
Marker类是可以被正确传递的(比如遵守必要的协议,或者是值类型/引用类型符合你的需求)。
内容的提问来源于stack exchange,提问作者Carabinieri
相关产品推荐
相关产品推荐

