到目前为止我所做的是有效的,但我想知道这是否是正确的方法。
我有一张 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 Sources和 Using Delegation to Communicate with Other Controllers也可能有用。
关于objective-c - 如何正确地从另一个 viewController 中删除一个 pin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11777259/