0

我有一个将 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;
4

3 回答 3

2

您正在做的事情称为downcasting。您需要这样做,因为多态性允许分配指向某个类的对象的指针,指向其类的子类的对象的指针,但反之亦然(因为没有说指针实际上会指向属于该子类的对象,而在相反的情况下,这是保证的)。

这是UIWindow您要调用的属性:

@property(nonatomic, retain) UIViewController *rootViewController;  

就像你看到它的类型UIViewController,并且CoursesTableViewControllerUIViewController.

PS:当我说需要它时,我的意思是避免编译器警告。

于 2013-07-20T00:14:24.900 回答
0

rootViewControllerUIWindow类型的属性UIViewController

如果您想与特定于您的类型的属性和选择器交互,则需要将其转换为您的控制器类型。

于 2013-07-20T00:12:00.920 回答
0

你实际上可以这样做。它只会警告你,因为他在期待一件事,而他正在看到另一件事。当您进行强制转换时,只是让编译器知道您在做什么是可以的。

其类型:

在此处输入图像描述

于 2013-07-20T00:16:06.613 回答