什么时候在客观c中投射物体?

时间:2014-01-09 04:33:23

标签: objective-c casting uinavigationcontroller subclass

投射是否有一般规则?

到目前为止,当我希望对象属于我创建的自定义超类的类型时,我只使用了objective-c。例如class: Car, subclass: Ford我将Ford对象投射到(Car *)

但是我正在阅读一些示例代码,我发现了这个:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:      (NSDictionary *)launchOptions 
{
    UINavigationController *nav = (UINavigationController *) self.window.rootViewController;

    CoursesTableViewController *cvtc = (CoursesTableViewController *) [[nav viewControllers] objectAtIndex:0];

    cvtc.managedObjectContext = self.managedObjectContext;

    return YES;
}

为什么nav已经转换为(UINavigationController *)?同样适用于cvtc,但对于TableViewController

的自定义子类

2 个答案:

答案 0 :(得分:3)

self.window.rootViewController的类型为UIViewController而不是UINavigationController。并UINavigationController继承UIViewController。这就是它被类型化的原因。

同样,CoursesTableViewController被强制转换为[[nav viewControllers] objectAtIndex:0];的返回类型为id

答案 1 :(得分:0)

  

为什么nav已经转换为(UINavigationController *)?

self.window.rootViewController提供了窗口的内容视图。

它会将结果内容视图返回为UIViewController。您可能会被分配任何派生自UIViewController的类self.window.rootViewController

因此按照你的代码投射它是你的责任。

  

同样适用于cvtc但是对于TableViewController的自定义子类

以上解释将涵盖这一点。