UITableView 中的 MKMapView 和编辑

Posted

技术标签:

【中文标题】UITableView 中的 MKMapView 和编辑【英文标题】:MKMapView in a UITableView and editing 【发布时间】:2010-01-12 14:25:21 【问题描述】:

我有一个 UITableView 有两个需要编辑的部分。第一部分是一些包含文本、数字和日期内容的单元格,它们提供了一个单独的视图控制器来编辑值。

底部是一个显示自定义单元格的单元格,该单元格具有 MKMapView。此单元格用于可视化此特定信息记录的位置。我希望这个单元格可以“就地”编辑:

MKMapView 变得可滚动 地图中心(用十字线表示)是(新)位置

我不知道如何继续:

当单元格变为可编辑(从固定到可滚动)时,在哪里设置状态更改 设置新位置后如何更新基础实体?

【问题讨论】:

【参考方案1】:

将滚动视图放在一起可能会很棘手。 MKMapView 不是真正的滚动视图(即,它不是从 UIScrollView 派生的),但我不确定这会对您有所帮助。我建议从 TableView 中删除 MKMapView,因为解析它和 TableView 之间的接触会变得很冒险。

【讨论】:

我禁用了表格视图的滚动,效果很好。我真的不知道这是否是这样做的方式,但对我来说,可视化和编辑位置属性的方式是显示地图视图是有意义的。 如果你没有在表格中使用滚动,那你为什么要使用表格呢?为什么不只是两个单独的视图,一个表格和一个地图?【参考方案2】:

    我不完全确定你想要得到什么,但是为什么你需要将 MKMapView 放在 UITableViewCell 中? 您可以通过更改其 userInteractionEnabled 属性来启用/禁用地图视图上的滚动。设置新位置后,您只需更新 mapView 的可见区域(使用 -setCenterCoordinate: 或 - setRegion: 方法) - 因此无需使用 UITableView 的方法。

【讨论】:

我想要表格视图中的地图视图,因为位置是我想要可视化的对象的关键属性。感谢有关 userInteractionEnabled 的提示 - 我正在尝试使用 scrollEnabled,但我不确定它是否有效。【参考方案3】:

我想通了一半。在自定义单元格上切换用户交互只是放置

- (void)setEditing:(BOOL)editing animated:(BOOL)animated 
    [super setEditing:editing animated:animated];
    [self.mapView setUserInteractionEnabled:editing];

在 UITableViewCell 子类中。

对于位置,我将尝试在

上发布通知
mapView:regionDidChangeAnimated:

事件。如果成功了,我会告诉你的。

【讨论】:

你这样做了吗?我发现它可以正常工作,直到你疯狂地上下滑动桌子,它有时会因旧的 EXC_BAD_ACCESS 而崩溃。 恐怕我不记得我是如何解决这个问题的了。你确定你没有过度释放吗?【参考方案4】:

我遇到了同样的问题:在自定义 UITableViewCell 中嵌入 MKMapView。

经过一下午的嘲笑,我很幸运地找到了解决方案。就我而言,解决方案最终非常简单。问题是由于在我的自定义 tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 中定义的单元格高度对于 MKMapView 来说太短了。你不会从它的外观上知道。您实际上可以定义比在 heightForRowAtIndexPath 中定义的要高得多的自定义 tableview 单元格的视图。猜猜看,外观将由自定义表格视图单元格的视图高度决定。但它不会正常工作。超出此范围的区域在 heightForRowAtIndexPath 中定义,不响应任何用户交互。这就是为什么我的 MKMapView 在嵌入 tableview 单元格时不可缩放或不可移动的原因。这是一个编译器错误,我希望 Apple 能够修复。

还要确保禁用 tableView 滚动,否则应该滚动哪个会让人感到困惑。

【讨论】:

以上是关于UITableView 中的 MKMapView 和编辑的主要内容,如果未能解决你的问题,请参考以下文章

从另一个视图中的 MKMapView 中删除注释

MKMapView 的圆角

UITableView:停止自动滚动超出所选位置

从另一个类缩放 MkMapView

使用 MKMapView、核心位置和核心数据

MKMapView 第一次出现时未正确居中(但此后有效)