0

我在管理地图视图的控制器的头文件中声明了一个协议。

@protocol UCMapViewDelegate <NSObject>
@required
- (void)pushMapviewRight;

@end

我在另一个视图控制器 (.h) 中声明协议的实现并在 .m 文件中实现它

// in the UCRootViewController.h
@interface UCRootViewController : UIViewController <UCMapviewDelegate>

// in the UCRootViewController.m
- (void)pushMapviewRight
{
    NSLog(@"push mapview right");
}

我将委托设置为指向 rootviewController 的属性。这是在我的 MapviewController 的 viewDidLoad() 中完成的,带有一个 property @property (weak, nonatomic) id<UCMapViewDelegate> delegate;

// in UCRootViewController
self.mapviewController.rootviewController = self;

// in UCMapViewController
self.delegate = (id<UCMapviewDelegate>)self.rootviewController;

调用委托方法。当 mapviewController 中的一个按钮被按下并且它工作时,showMenu() 被执行。但委托方法不会被调用。

- (void)showMenu
{
    NSLog(@"show menu");
    [self.delegate pushMapviewRight];
}

但是什么也没发生……怎么了?!非常感谢您的帮助!

4

3 回答 3

0

我修好了它。起初我使用 NSLog 来验证 self 不是 nil (这很明显,但仍然)我实际上不确定为什么,但self.mapviewController.rootviewController = self;没有“延续”到我想引用 self.rootViewController 的地步,虽然 self在我将它设置为指向 rootViewController 的指针时不是零。

我通过创建另一个来修复它,initWithRootViewController:(UCRootViewController*) ctrl并在创建 MapViewController 时将 self 作为参数传递。

有人可以解释为什么 MapViewController 中没有对 self (=rootViewController) 的有效引用吗?

于 2012-05-10T00:36:59.010 回答
0

rootViewController属性是强引用还是弱引用?应该很强大吧。如果对象没有弱引用,那么它会立即被释放,当它们指向的对象被释放时,弱引用会被清空。您需要在应用程序中的某个地方有一个强引用,以使对象可以四处游荡。

于 2012-05-10T00:40:31.457 回答
0

正如@CodaFi 所说,您的代码看起来很乱。为什么要在 UCMapViewController 中设置委托属性值?当弹出或准备 segue 时,应在其父级中设置委托。

基本上,如果您的 UCMapViewController 了解 UCRootViewController 实现委托方法,为什么不直接从 riitVuewController 调用它的方法呢?根本不需要设置委托。

下面是一个使用故事板和 segue 的例子,UCMyViewController 将把 segue 推送到 UCMapViewController:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  ...
  [segue.destinationViewController setDelegate:self.rootViewController];
  ...
}
于 2012-05-10T00:54:25.070 回答