objective-c - 如何正确地从另一个 viewController 中删除一个 pin

标签 objective-c ios uitableview uiviewcontroller mkannotation

到目前为止我所做的是有效的,但我想知道这是否是正确的方法。

我有一张 map ,当按下此按钮时会显示注释并显示标注。

下一个显示的 View 是表格 View 。该表有一个按钮可以删除该注释。

我在 MKMapView 类型的 TableView 中创建了一个属性。在点击 callOut 附件时初始化此 View 后,我设置了 MKMapView 属性。

当在表格 View 中按下按钮时,我通过 map 属性删除注释。

这是正确的方法吗?

最佳答案

与其让详细 View 直接操作父( map ) Controller View 的控件,不如使用委托(delegate)+协议(protocol)更“正确”的方法。

使用 map Controller 需要实现的方法(例如 deleteAnnotation、detailViewDone 等)定义一个协议(protocol)。

详细 View 将具有该协议(protocol)的委托(delegate)属性,并通过委托(delegate)属性调用协议(protocol)方法,而不是直接访问和修改另一个 View 的控件。

map Controller 会将自己设置为详细 View 的委托(delegate)并实际实现协议(protocol)方法。

这样,每个 Controller /类都不必知道其他 Controller /类如何工作的内部细节,让您更轻松地更改每个 Controller /类的内部工作方式,而不会影响其他 Controller /类中的代码(只要协议(protocol)不改变)。它提高了封装性和可重用性。

例如在detail view.h中,定义protocol并声明delegate属性:

@protocol DetailViewControllerDelegate <NSObject>
-(void)deleteAnnotation:(id<MKAnnotation>)annotation;
-(void)detailViewDone;
//could have more methods or change/add parameters as needed
@end

@interface DetailViewController : UIViewController
@property (nonatomic, assign) id<DetailViewControllerDelegate> delegate;
@end

在详细 View .m 中,无论您在哪里处理删除按钮,都调用委托(delegate)方法:

if ([delegate respondsToSelector:@selector(deleteAnnotation:)])
{
    [delegate deleteAnnotation:annotation];
}

在map controller.h中,声明实现协议(protocol)并声明方法:

@interface MapViewController : UIViewController<DetailViewControllerDelegate>
-(void)deleteAnnotation:(id<MKAnnotation>)annotation;
-(void)detailViewDone;     
@end

在 map Controller .m 中,在创建详细 View 的 calloutAccessoryControlTapped 中,设置委托(delegate)属性而不是 map View 属性:

DetailViewController *dvc = [[DetailViewController alloc] init...
dvc.annotation = view.annotation;
dvc.delegate = self;
[self presentModalViewController:dvc animated:YES];

最后,同样在 map Controller .m中,实现委托(delegate)方法:

-(void)deleteAnnotation:(id<MKAnnotation>)annotation
{
    [mapView removeAnnotation:annotation];
    //dismiss the detail view (if that's what you want)...
    [self dismissModalViewControllerAnimated:YES];
}

来自文档,文章Delegates and Data SourcesUsing Delegation to Communicate with Other Controllers也可能有用。

关于objective-c - 如何正确地从另一个 viewController 中删除一个 pin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11777259/

相关文章:

objective-c - Cocoa 模型应该包含自己的数据访问方法吗?

ios - 如何使用自己的图片制作圆形进度表?

html - 通过 CSS 防止 Safari (Mavericks/iOS7) 中的连字

ios:将字符串解析为数组

ios - 单击按钮时如何设置 TextView 的打开和关闭?

ios - 在 iOS 中的核心数据和 NSFetchedResultsController 中点击我的屏幕之前,reloadData 无法正常工作

objective-c - UItableviewcontroller 单元格文本标签内容不显示

ios - opentok.bundle 丢失

objective-c - 将 Storyboard中的 UIViewController 更改为 UITableViewController?

ios - 调用 imageWithData :UIImageJPEGRepresentation() multiple times only compresses image the first time