如果题目没有那么准确,抱歉。我想建立一个从点到点的地图路线,关键是两个点都是用户定义的。所以我想从接口构建器中传递一个源点mapItem和目标点mapItem,并在它们之间建立一条路线。
我做了什么:我有一个建议表视图控制器,当在搜索栏中输入一些东西时,它会为搜索表视图控制器建议一些地方;然后搜索TVC将带有名称和地址的地图注释传递给结果地图视图。在我的结果图视图中,我有两个按钮:源和目的地。因此,当地址从搜索TVC传递过来时,mapView建议按两个按钮。如果Destination按钮被按下,则意味着Source地图项为nil,它将建立从我当前位置到目的地地图项的路线。这里没有问题,但是当按下Source按钮时,源地图项目没有被存储,当搜索目的地地图项目并按下Destination按钮时,应用程序再次从我的当前位置建立路线,忽略了之前我按下了Source按钮,我需要的路线不是从我的当前位置,而是从源地图项目。
所以在代码中,我定义了变量。
var mapItems: [MKMapItem]?
private var sourceMapItem: MKMapItem!
@IBOutlet weak var selectPointBmessage: UILabel!
@IBOutlet weak var resultMapView: MKMapView!
@IBOutlet weak var resultName: UILabel!
@IBOutlet weak var resultAddress: UILabel!
两个函数: findMe(), 搜索我的当前位置, 和buildRoute(destinationMapItem: MKMapItem), 如果源地图项目为nil, 则从我的当前位置建立一条路线到destinationMapItem.
和两个按钮。
@IBAction func sourceButton(_ sender: UIButton) {
// add searched mapItems to Array of MapItems
sourceMapItem = mapItems!.first
// message saying the user to find destination is source button is pressed
selectPointBmessage.isHidden = false
}
@IBAction func buildRouteButton(_ sender: UIButton) {
// add searched mapItems to Array of MapItems
let destinationMapItems = mapItems!.compactMap { (mapItem) -> MKMapItem in
let destinationMapItem = mapItem
return destinationMapItem
}
// for each if several or for one if one - build a route(s) to it
for destinationMapItem in destinationMapItems {
buildRoute(sourceMapItem: sourceMapItem, destinationMapItem: destinationMapItem)
}
}
(mapItems是在搜索表视图控制器中定义和记录的。在这里,我们使用压缩地图解压,并开始与它们进行交互。)
还添加了StoryBoard的printScreen来展示它是如何组织的。故事板的打印屏幕如果需要一些更多的细节,请打。
所以:如何让我的应用记住sourceMapItem,当Destination按钮被按下时,建立一条从点到用户定义的点的路线?
所以我创建了一个mapItems数组,当表行被选中时,将mapItems存储在其中。然后当调用我的按钮时,使用该数组,我已经为我的源点和目的点分配了值。