我在管理地图视图的Controller的头文件中声明了一个协议。
@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 (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];
}
但没有任何反应..出了什么问题?!非常感谢帮助!
答案 0 :(得分:0)
我修好了。起初我使用NSLog来验证self不是nil(这很明显
,但仍然)我实际上不确定为什么,但是self.mapviewController.rootviewController = self;
没有“延续”到我想引用self.rootViewController的程度,尽管在我设置它的时候self不是nil指向rootViewController的指针。
我通过创建另一个initWithRootViewController:(UCRootViewController*) ctrl
来修复它,并在创建MapViewController时将self作为参数传递。
有人可以解释为什么对自己(= rootViewController)的有效引用在MapViewController中不可用吗?
答案 1 :(得分:0)
rootViewController
属性是强引用还是弱引用?它可能应该很强大。如果没有对该对象的弱引用,则它将立即释放,并且当它们指向的对象被释放时,弱引用将被填充。您需要在应用程序的某处使用强引用来悬挂对象。
答案 2 :(得分:0)
正如@CodaFi所说,你的代码看起来很混乱。为什么在UCMapViewController中设置委托属性值?当弹出或准备segue时,应该在其父级中设置委托。
基本上,如果你的UCMapViewController知道实现委托方法的UCRootViewController,为什么不直接从riitVuewController调用它的方法呢?根本不需要设置代理。
以下是使用storyboard和segue的一个例子,UCMyViewController将把segue推送到UCMapViewController:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
...
[segue.destinationViewController setDelegate:self.rootViewController];
...
}