使用UINavigationController删除KVO forOserver

时间:2012-06-01 06:29:28

标签: iphone key-value-observing

我正在尝试使用Storyboard并使用KVC减少我的类之间的耦合。与“联系人”应用程序一样,我有可编辑的字段,可以在新的视图控制器中编辑数据。在我展示我的一个detailViewControllers之前,我会做这样的事情

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"ShowDetailMap"]) {
        UIViewController *destination = ((UINavigationController *)segue.destinationViewController).topViewController;

        if ([destination respondsToSelector:@selector(setMapTypeAsNum:)]) {
            [destination setValue:[NSNumber numberWithInteger:self.mapView.mapType] forKey:@"mapTypeAsNum"];

            [destination addObserver:self forKeyPath:@"mapTypeAsNum" options:NSKeyValueObservingOptionNew context:NULL];
        }

如何删除Observer并维护类之间的松散耦合?我可以将我的viewController类与UINavigationControllerDelegate协议相符合,但是执行以下操作似乎很糟糕:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    if ([viewController respondsToSelector:@selector(setNewmap:)]) {
        if ([[navigationController topViewController] isKindOfClass:[AddMapViewController class]]) {
           // remove observer
        }
    }
}

似乎应该有一个更好的方法来删除Observer,而不是检查DetailViewController是否属于某种类型并删除该视图控制器的观察者。你会重新推荐什么?感谢。

1 个答案:

答案 0 :(得分:0)

一种方法是让所有基类都有两种方法

  • 一个用于注册获取目标的观察者 观察键作为参数。基类中的函数会 什么都不做,这个函数将在子代中继承和重新定义 注册观察员的类
  • 另一个函数将删除对该键或所有观察键的观察。此函数在基类中不执行任何操作,但在派生类上,如果它们符合
  • ,它将删除您指定的观察键。

使用这种方法可以最大化视图的解耦,因为如果类符合或不符合给定的观察结果,所有调用者都不必担心