我有一个故事板,其中rootViewController类设置为CoursesTableViewController。
为什么在appDelegate中我需要使用类型转换,如本示例所示......
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
CoursesTableViewController *cvtc
= (CoursesTableViewController *)self.window.rootViewController;
为什么我不能这样做......
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
CoursesTableViewController *cvtc = self.window.rootViewController;
答案 0 :(得分:2)
您正在做的事情被称为向下转型。你需要这样做,因为多态允许指向某个类的对象的指针,指向它的类的子类的对象的指针,但不是反之亦然(因为它没有说指针实际上指向一个属于该子类的对象,而在相反的情况下,这是保证的)。
这是您要调用的UIWindow
属性:
@property(nonatomic, retain) UIViewController *rootViewController;
就像你看到UIViewController
类型一样,CoursesTableViewController
是UIViewController
的子类。
PS :当我说它需要时,我的意思是避免编译器警告。
答案 1 :(得分:0)
rootViewController
是UIWindow
类型UIViewController
的属性。
如果要与特定于您的类型的属性和选择器进行交互,则需要将其强制转换为控制器类型。
答案 2 :(得分:0)
你实际上可以这样做。它只是警告你,因为期待一件事他正在看另一件事。当你进行投射时,只需让编译器知道你正在做什么就好了。
其类型: