将相同的视图从 VC1 传递到 VC2

Posted

技术标签:

【中文标题】将相同的视图从 VC1 传递到 VC2【英文标题】:Pass & display the same view from VC1 to VC2 【发布时间】:2018-01-17 11:38:37 【问题描述】:

我有一个视图(在我的例子中是一个 MGLMapview : mapboxView),它显示在我的第一个 VC 中。我希望我的第二个 VC 显示相同的视图。

所以从 VC1 到 VC2 我做了:

self.VC2.mapView = self.mapView

self.navigationController?.pushViewController(self.VC2, animated: true)

然后在VC2的viewDidLoad中:

view.addSubview(mapView)

我的问题是什么都没有出现。 但是,当我在第二个 VC 中打印 mapView 的大小和高度时,它不为零。

我错过了什么吗?

感谢您的帮助

【问题讨论】:

您是如何创建视图的?在任何情况下,最有可能的问题是您需要将视图本身复制到您的其他 VC,因为通过调用 view.addSubview(mapView) 您只显示 mapView,但是当您实际推送 VC2 时,VC1 可能会得到从内存中卸载,因此 mapView 对象本身也可能被破坏。 你可以推送同一个视图控制器而不是创建一个新的。 self.navigationController?.pushViewController(self.VC1, animated: true) 你如何传递你的地图视图?是为segue做准备还是什么?您是如何将 vc1 连接到要推送的 vc2 实例的?您需要查找相对于 vc2 视图的地图视图的矩形。请提供更多代码。 view.addSubview(mapView)之后在VC2中添加self.mapView?.translatesAutoresizingMaskIntoConstraints = true。这将解决问题 @Priya 没用。但验证答案解释了原因 【参考方案1】:

我也问过自己这个问题。我不知道这是否可能(我从来没有找到办法),但不建议这样做。将视图放入视图控制器后(通过 addSubview 在其 view 上),视图控制器“拥有”该视图。

UIView documentation 解释了原因:

视图可以嵌套在其他视图中以创建视图层次结构,这提供了一种组织相关内容的便捷方式。嵌套视图会在被嵌套的子视图(称为子视图)和父视图(称为父视图)之间创建父子关系。 一个父视图可以包含任意数量的子视图,但每个子视图只有一个父视图。

相反,添加您在 VC2 中设置新地图视图所需的属性(例如中心、跨度、任何注释详细信息)并在第二个视图控制器中设置新地图视图。

【讨论】:

好的,谢谢您的回复。我想避免创建新的对象映射以提高效率和减少消耗。但如果这是唯一的方法.. 这表示一个子视图只能有一个父视图,但它没有指定它的生命周期应该只有一个父视图。即使使用 MGLMapView,我也在寻找相同的解决方案。地图在初始化时加载样式真的很慢,感觉就像一个糟糕的用户体验。我已经有一个初始化的地图,我需要初始化一个全新的地图以在不同的屏幕上显示略有不同的信息,这似乎很愚蠢。 @JakeT。如果你让它工作,请在这里添加一个答案。如果你不能让它与裸视图一起工作,你也可以尝试将视图包装在“自定义容器视图控制器”中并使用addChildViewController:removeFromParentViewController 等来传输它。

以上是关于将相同的视图从 VC1 传递到 VC2的主要内容,如果未能解决你的问题,请参考以下文章

将值从 VC1 传递到 VC2

使用模态动画推送 ViewController(水平翻转)

如何快速维护视图层次结构

从 1 个视图控制器转到另一个

导航视图控制器不显示后退按钮

如何在没有 segue 和 storyboard 编程的情况下传递数据?