Objective c 正在尝试设置属性值,但该值为零
我在管理地图视图的控制器的头文件中声明了一个协议Objective c 正在尝试设置属性值,但该值为零,objective-c,ios,cocoa-touch,Objective C,Ios,Cocoa Touch,我在管理地图视图的控制器的头文件中声明了一个协议 @protocol UCMapViewDelegate <NSObject> @required - (void)pushMapviewRight; @end 但是什么也没发生。。怎么了?非常感谢您的帮助 我把它修好了。起初,我使用NSLog验证self不是nil,这很明显 ,但我仍然不知道为什么,但是self.mapviewController.rootviewController=self;没有转到我想要引用self.root
@protocol UCMapViewDelegate <NSObject>
@required
- (void)pushMapviewRight;
@end
但是什么也没发生。。怎么了?非常感谢您的帮助 我把它修好了。起初,我使用NSLog验证self不是nil,这很明显 ,但我仍然不知道为什么,但是self.mapviewController.rootviewController=self;没有转到我想要引用self.rootViewController的点,尽管self在我将其设置为指向rootViewController的指针时不是nil 我通过创建另一个initWithRootViewController修复了它:UCRootViewController*ctrland在创建MapViewController时将self作为参数传递
有人能解释一下为什么对self=rootViewController的有效引用在MapViewController中不可用吗?rootViewController属性是强引用还是弱引用?它应该很强壮。如果没有对对象的弱引用,那么它将立即被释放,并且当它们指向的对象被释放时,弱引用将被清除。您需要在应用程序中的某个地方有一个强引用,以便让对象挂起。正如@CodaFi所说,您的代码看起来很混乱。为什么在UCMapViewController中设置委托属性值?当弹出或准备继续时,代理应在其父级中设置 基本上,如果您的UCMapViewController了解UCRootViewController实现委托方法,为什么不直接从riitVuewController调用其方法呢?根本不需要设置委托 下面是一个使用故事板和segue的示例,UCMyViewController将把segue推送到UCMapViewController:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
...
[segue.destinationViewController setDelegate:self.rootViewController];
...
}
通过在.h中声明您的意图以符合委托,而不是所有那些疯狂的施法,它将避免很多尴尬。也不要在appDelegate中设置委托这不是它的目的,如果在appDelegate中未设置UCRootViewControllerit,请在相关委托类中设置它们。。我为我的mapviewController设置了代理,该代理应在其ViewDidLoad中为UCRootViewController。如果在分配代理的位置记录self.rootviewController的值,您会看到什么?phillip Mills:请参阅我的编辑。。。值为nil,但我不明白为什么会这样,因为当我设置rootviewController时,self不能为nil?如果这不是来自appDelegate,那么属性rootviewController是什么?因为UIViewController没有rootViewController属性,所以只有UINavigationController有。它是/是强的。也许你可以看一下我的答案并向我解释一下?在将其分配给代理属性之前,你确定要分配给rootViewController吗?在两者上都设置断点,看哪一个先被触发。是的,我做了。但是我解决了我的问题,请看下面的答案。我删除了对rootViewController的引用,并使用initWithDelegate方法设置委托
// in UCRootViewController
self.mapviewController.rootviewController = self;
// in UCMapViewController
self.delegate = (id<UCMapviewDelegate>)self.rootviewController;
- (void)showMenu
{
NSLog(@"show menu");
[self.delegate pushMapviewRight];
}
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
...
[segue.destinationViewController setDelegate:self.rootViewController];
...
}