目标:
我有一个声明地图视图并找到用户当前位置的类。此类称为MapController()
。
我还有另一个需要调用MapController()
的类,并在用户的当前位置放置一个图钉。
问题:
当我在另一个类中并尝试调用MapController()
时,MapController()
的MapView从未初始化。
解决方案我需要:
如何初始化MapView?
最佳答案
您多次引用:
let map = MapController().mapView
那没有做您认为做的事:
MapController()
并非实例化现有视图控制器上的地图,而是实例化了全新的视图控制器。但是,由于您不对该视图控制器执行任何操作,而只是让它超出范围,因此会立即将其释放。即使您没有让它超出范围(例如,您以某种方式过渡到它),也不会通过情节提要实例化它,因此出口将是
nil
。如果您确实试图实例化MapController
的新实例,则可以执行以下操作:let controller = storyboard?.instantiateViewControllerWithIdentifier("MapControllerScene")
坦白说,即使您解决了上述问题,一个视图控制器也没有与另一个视图控制器场景的
MKMapView
直接交互的业务。因此,问题是实现您期望的正确方法是什么。
有三种基本技术:
保持“添加注释”和地图视图松散耦合,并使“注释详细信息视图控制器”仅向
NSNotificationCenter.defaultCenter()
发布通知,然后让地图视图遵守该自定义通知。浏览视图控制器层次结构以转到地图视图控制器(例如,导航栏选项卡控制器的第二个子控件)。或主动将地图视图控制器引用作为参数从视图控制器传递到视图控制器。无论如何,如果您引用了现有的地图视图控制器,则现在可以直接将数据传回。您可能想要实现一个协议,以避免这两个类的紧密结合。
执行一些放松搜索,以从便笺详细信息视图控制器导航回到地图视图,然后使用
prepareForSegue
将数据传递回去。在iOS 9中,您不再需要单独跳到视图控制器层次结构中的更高级别,尽管这样做会让您的生活变得更轻松。关于ios - 如何在Swift中初始化MapView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33961745/