Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 正在尝试设置属性值,但该值为零_Objective C_Ios_Cocoa Touch - Fatal编程技术网

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