将RootViewController分配给UIViewController会发出警告 - 为什么?

时间:2011-09-21 21:44:09

标签: iphone objective-c uikit

我想在其中一个类中访问我的App的RootViewController,以呈现模态视图控制器。我这样做是通过获取ApplicationDelegate并询问它的RootViewController并将其存储在UIViewController中

AppDelegate *appDelegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
UIViewController* presentingViewController = appDelegate.viewController;

在我看来,这应该没有警告,因为RootViewController继承自UIViewController。但是我收到了这个警告:

使用“RootViewController *”类型的表达式初始化“UIViewController * __ strong”的指针类型不兼容

有人可以向我解释为什么我会看到这个警告吗?

如果有帮助 - 这是我定义RootViewController的AppDelegate:

@interface AppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow            *window;
    RootViewController  *viewController;
}

@property (strong) RootViewController *viewController;

我像这样定义了我的RootViewController:

@interface RootViewController : UIViewController {

}

2 个答案:

答案 0 :(得分:1)

您可以将对象分配给声明为其超类的变量。这是没有问题的,当你只想在一组你自己的子类上使用超类方法时非常有用,特别是当下一个视图控制器的特定类型未知时,导航堆栈中的视图控制器很常见。

还要考虑一下。像

这样的方法
[self presentModalViewController:customController animated:YES];
如果不能做到这一点,

将无法运作。此方法被声明为采用UIViewController *,但是您传递了一个自定义的UIViewController子类而没有任何抱怨。最后

[rootViewController isKindOfClass:[UIViewController class]];

将返回YES。 QED。

您是否已在您的应用委托的标头中转发声明您的类RootViewController? 即

@class RootViewController;
@interface AppDelegate : NSObject <UIApplicationDelegate> {
....

你拼写正确吗?这是错误输入的常见区域,因为xCode不会自动完成前向声明。然后它会在头文件的其余部分自动填写您的拼写错误。

您是否记得将RootViewController的头文件导入到AppDelegate的.m文件中?您仍然需要这样做,以便编译器知道无效性。

您的代码目前看起来是正确的,但我们没有全部。

答案 1 :(得分:0)

问题是RootViewControllerUIViewController不是同一类。

在AppDelegate中,您声明viewControllerRootViewController类型。然后,在这些行中:

AppDelegate *appDelegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
UIViewController* presentingViewController = appDelegate.viewController;

您正在创建presentingViewController类型UIViewController,并将其设置为RootViewController的实例。这是错误的来源。

使用一致的类型修复此问题。

阅读What's the difference between the RootViewController, AppDelegate and the View Controller classes that I may create?,了解这两种类型之间的区别。