0

我正在尝试使用 Storyboards 并使用 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
        }
    }
}

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

4

1 回答 1

0

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

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

使用这种方法,视图的解耦将被最大化,因为调用者都不必担心类是否符合给定的观察

于 2012-06-01T06:43:10.690 回答