试图设置属性值,但它是零

时间:2012-05-09 23:40:49

标签: objective-c ios cocoa-touch

我在管理地图视图的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];
}

但没有任何反应..出了什么问题?!非常感谢帮助!

3 个答案:

答案 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];
  ...
}