【问题标题】:Incompatible pointer types initializing UINavigationController with an expression of type UIViewController使用 UIViewController 类型的表达式初始化 UINavigationController 的不兼容指针类型
【发布时间】:2015-12-05 17:48:06
【问题描述】:
1. UINavigationController *rnc = self.app.window.rootViewController;

我收到警告使用 UIViewController 类型的表达式初始化 UINavigationController 的指针类型不兼容

2. UINavigationController *rnc = (UINavigationController *)self.app.window.rootViewController;

选项 1 显示警告“使用 UIViewController 类型的表达式初始化 UINavigationController 的指针类型不兼容”,选项 2 不显示。为什么 ?如果我不像选项 2 那样施放,会有什么风险?

更新

将 UIViewController 转换为 UINavigationController 有什么风险?

【问题讨论】:

  • @adobels 风险在于window 上的rootViewController 实际上不是UINavigationController*(或子类)的实例,并且您的应用程序在运行时崩溃。 Swift 通过要求以 rnc = window.rootViewController as! UINavigationController 的形式进行强制转换来缓解这个问题。 “演员表”(实际上并不是演员表)将在运行时进行检查。

标签: objective-c uiviewcontroller uinavigationcontroller


【解决方案1】:

警告很清楚。在案例 1 中,rootViewController 的类型为 UIViewController,您将 UIViewController 实例提供给 UINavigationController

在情况 2 中,您正在进行强制转换以将 UIViewController 转换为 UINavigationController,因此编译器没有给出任何警告。

您不应尝试将UIViewController 转换为UINavigationController。他们都是不同的。 UINavigationControllerUIViewController 的子类。

如果您想将 rootViewController 嵌入到导航控制器中,那么您应该执行以下操作:

 YourRootViewController *rootViewController = self.app.window.rootViewController;
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootViewController];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多