我想在其中一个类中访问我的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 {
}
答案 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)
问题是RootViewController
与UIViewController
不是同一类。
在AppDelegate中,您声明viewController
为RootViewController
类型。然后,在这些行中:
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?,了解这两种类型之间的区别。