在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;
答案 0 :(得分:0)
Apple在这里和许多其他地方使用ID的原因是为了保证灵活性并防止过时。
尽管属性的名称,destinationViewController
可能并不总是返回UIViewController
对象。或者更具体地说,Apple不希望重构这些方法,如果一年后他们有一些新的,特殊的视图控制器不继承UIViewController
。因此,使用ID可以防止过时。
另请注意,您可能并不总是希望将返回的对象强制转换为UIViewController.
例如,如果视图控制器嵌入到将由destinationViewController返回的UINavigationController
中。虽然UINavigationController
是UIViewController
的孩子,但在大多数情况下你不想这样做,因为你通常想从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;
}
因此,这种设计可以为开发人员提供灵活性。