【问题标题】:How to properly remove a pin from another viewController如何从另一个 viewController 中正确删除 pin
【发布时间】:2012-08-02 12:18:26
【问题描述】:

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

我有一个显示注释的地图,当按下它时显示一个标注。

显示的下一个视图是表格视图。此表有一个用于删除该注释的按钮。

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

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

这是正确的方法吗?

【问题讨论】:

    标签: objective-c ios uitableview uiviewcontroller mkannotation


    【解决方案1】:

    与其直接操作父(地图)控制器视图的控件的详细视图相比,更“正确”的方法可能是使用委托+协议。

    使用地图控制器需要实现的方法定义协议(例如,deleteAnnotation、detailViewDone 等)。

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

    地图控制器会将自己设置为详细视图的委托,并实际实现协议方法。

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

    例如,在详细视图.h中,定义协议并声明委托属性:

    @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
    

    在详细视图 .m 中,无论您在何处处理删除按钮,都应调用委托方法:

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

    在地图控制器.h中,声明它实现了协议并声明了方法:

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

    在地图控制器 .m 中,在您创建详细视图的 calloutAccessoryControlTapped 中,设置委托属性而不是地图视图属性:

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

    最后,同样在地图控制器.m中,实现委托方法:

    -(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 也可能有用。

    【讨论】:

    • 感谢您的出色解释。这比我迄今为止所学的要先进得多。但是,了解它非常好。谢谢
    • 只有一个问题 Anna,如果您没有将 dvc.annotation 声明为属性,为什么还要设置它。谢谢
    • 我假设您已经在细节控制器上拥有这样的属性,因此它知道要显示哪个注释。如果没有,你可以添加它。
    • 我会尝试实施这种方法。但是,如果我不遵循这一点,我可以在 DetailViewController 中设置一个属性来存储 mapView 对象。如果我选择第二种“风格”,我是不是像你说的那样暴露了每个控制器的细节?
    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多