代表:重访

不久前,我写了一篇有关委托模式及其在iOS中的使用的文章,该模式是跨控制器通信的简单方法。 在我写完它之后,我遇到了一些有关委托和容器视图的问题。 在第三个响应之后,我发现自己反复地写同样的东西,所以我决定只写一个小应用程序并用它来解释自己。 您可以在此处查看源。

该应用程序本身非常简单。 它的主视图有一张地图和一张桌子。 我们想要的行为是:在地图上点击某行时,应放大其对应的引脚,如果点击某引脚,则表格应移至相应的行。

现在我们可以将所有这些都转储到一个控制器中,但这有点混乱。 相反,我们将其分为三个控制器。 其中两个很明显,一个用于mapView,另一个用于tableView。 还需要第三者在控制器之间路由消息。 它也可以用于更改与容器视图关联的控制器,但是今天我们不需要。

首先打开情节提要,然后删除其中的所有内容。 接下来,拖出一个View Controller,然后将Container View放到该View Controller中。 选择容器视图,然后单击添加新约束按钮。 接下来,将顶部,左侧和右侧约束设置为零,取消选中“将约束约束到边距”,并将高度设置为250。在“更新框架”下拉列表中,选择“新约束的项目”。 底部的添加约束按钮应显示添加4个约束,单击它。

接下来,将第二个容器视图拖动到第一个容器视图的下方。 选择它,然后单击添加新约束按钮。 将顶部,左侧,右侧和底部约束设置为零,然后取消选中“约束为边距”。 在更新框架下拉列表中,选择“新约束项”。 底部的添加约束按钮应显示添加4个约束,单击它。

现在,单击顶部容器视图和底部容器之间的标记。 选择其属性检查器,并将其标识设置为ContainerToChildMapView。 对其他序列执行相同的操作,但是将其标识更改为ContainerToChildTableView。

好的,现在最后一步。 将地图工具包视图拖到顶部容器的视图上。 将其顶部,左侧,右侧和底部约束设置为0。接下来,将表格视图拖动到底部容器的视图上。 将其约束设置为与“地图工具包视图”相同。 现在,将表格视图单元格拖动到表格视图上。 在单元的属性检查器下,将其标识设置为locationCell。 最后,将标签拖动到表格视图单元格上。 单击标签,然后选择对齐按钮。 在容器中水平和垂直检查容器,并将它们保留为0。在更新框架下拉列表中,选择“新约束项”。 选择添加2个约束。

好吧,让我们写一些代码。

首先,我们需要一个模型。 可能有一个名为ViewController的文件,将其删除。 创建一个名为model的新组,并在该组中创建一个名为RestaurantLocation.swift的文件。 让它子类化NSObject并实现MKAnnotation协议。 MKMapView.addAnnotation(_ :)接受类型为MKAnnotation的对象作为“ pins”。 符合MKAnnotation要求您的类具有三个变量,标题,副标题和坐标。

它应该像这样:

目前,该应用程序不执行任何操作。 您可以在地图上四处移动,也可以在tableView中上下移动,但是那又如何呢? 我们要采取行动! 我们将通过实现mapView(_:didSelect :)和tableView(_:didSelectRowAt :)来获得它。

打开ChildMapViewDelegate.swift并实现mapView(_:didSelect :)。 此功能非常简单。 您将尝试将视图的注释投射为restaurantLocation,如果成功,您将调用其坐标的zoom。

您可以在此处查看完整的源代码:

https://github.com/shefHauwanga/mapTableDelegateExample/tree/master/mapToListOne