2

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

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

使用或理解使用会不会更容易UIViewController *,比如

@property(nonatomic, readonly) UIViewController *sourceViewController;
@property(nonatomic, readonly) UIViewController *destinationViewController;
4

1 回答 1

0

Apple 在这里和许多其他地方使用 id 的原因是允许灵活性并防止过时。

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

另请注意,您可能并不总是希望将返回的对象强制转换为 aUIViewController.例如,如果您的视图控制器嵌入在UINavigationController目标视图控制器将返回的 a 中。尽管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;
}

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

于 2013-03-06T17:33:06.650 回答