如何在Swift中初始化MapView

时间:2015-11-27 16:47:25

标签: ios swift maps mapkit

目标:

  1. 我有一个声明地图视图的类,并找到用户的当前位置。该类称为MapController()
  2. 我还有另一个需要拨打MapController()的课程,并在用户的当前位置放置一个针脚。
  3. 问题:

    虽然我在另一个班级并尝试拨打MapController(),但MapController()的MapView永远不会被初始化。

    我需要的解决方案:

    如何初始化MapView?

1 个答案:

答案 0 :(得分:0)

您参考了很多次:

let map = MapController().mapView

这不符合你的想法:

  • MapController()不是在现有视图控制器上引用地图,而是实例化一个全新的视图控制器。但是,由于您不对该视图控制器执行任何操作,而只是让它超出范围,因此会立即取消分配。

  • 即使你没有让它超出范围(例如你以某种方式转换到它),你也没有通过故事板实例化,所以网点将是nil。如果您真的想要实例化MapController的新实例,那么您可以执行以下操作:

    let controller = storyboard?.instantiateViewControllerWithIdentifier("MapControllerScene")
    
  • 坦率地说,即使你解决了上述问题,一个视图控制器也没有业务直接与另一个视图控制器场景的MKMapView交互。

所以,问题是实现目标的正确方法是什么。

有三种基本技术:

  1. 保持“添加备注”和地图视图松散耦合,并让Note Detail View Controller只向NSNotificationCenter.defaultCenter()发布通知,然后让地图视图观察该自定义通知。

    < / LI>
  2. 浏览视图控制器层次结构以转到地图视图控制器(例如导航栏标签控制器的第二个子节点)。或者主动将地图视图控制器参考传递为从视图控制器传递到视图控制器的参数。无论如何,如果您有对现有地图视图控制器的引用,您现在可以直接传回数据。您可能希望实现一个协议,以避免这两个类紧密耦合。

  3. 执行一些展开segue,从注释详细信息视图控制器返回到地图视图,然后使用prepareForSegue将数据传回。在iOS 9中,您不再需要单独放松到视图控制器层次结构中更高级别的类,但如果您这样做,这会让您的生活变得更轻松。