为什么UIStoryboardSegue中的sourceViewController属性是“id”

时间:2013-03-06 14:57:47

标签: ios objective-c uikit storyboard uistoryboardsegue

UIStoryboardSegue课程中,属性sourceViewController显然是UIViewController。为什么Apple将此属性标记为id

@property(nonatomic, readonly) id sourceViewController;
@property(nonatomic, readonly) id destinationViewController;

使用UIViewController *(如

)使用或理解是不是更容易
@property(nonatomic, readonly) UIViewController *sourceViewController;
@property(nonatomic, readonly) UIViewController *destinationViewController;

1 个答案:

答案 0 :(得分:0)

Apple在这里和许多其他地方使用ID的原因是为了保证灵活性并防止过时。

尽管属性的名称,destinationViewController可能并不总是返回UIViewController对象。或者更具体地说,Apple不希望重构这些方法,如果一年后他们有一些新的,特殊的视图控制器不继承UIViewController。因此,使用ID可以防止过时。

另请注意,您可能并不总是希望将返回的对象强制转换为UIViewController.例如,如果视图控制器嵌入到将由destinationViewController返回的UINavigationController中。虽然UINavigationControllerUIViewController的孩子,但在大多数情况下你不想这样做,因为你通常想从viewControllers属性中抓取它的视图控制器,就像这样:

// unwrap the controller if it's embedded in the nav controller.
UIViewController *controller;
if ([segue.destinationViewController isKindOfClass:[UINavigationController class]]) 
{
    UINavigationController *navController = 
           (UINavigationController *)segue.destinationViewController;

    controller = [navController.viewControllers objectAtIndex:0];

 } else {

    controller = segue.destinationViewController;
}

因此,这种设计可以为开发人员提供灵活性。