【问题标题】:Attempt to present a UIViewController whose view is not in the window hierarchy尝试呈现其视图不在窗口层次结构中的 UIViewController
【发布时间】:2016-03-26 12:44:58
【问题描述】:

我有一个具有以下层次结构的多视图应用程序:

splash -> 导航控制器 -> 表格视图控制器 -> 设置视图控制器

Splash 是应用程序入口点,因此成为根视图控制器。当我尝试通过设置视图控制器上的操作将磁贴添加到乐队时,我收到调试器警告:

application[1929:1000746] 警告:尝试在视图不在窗口层次结构中的 上呈现

这会在调用MSBClient.tileManager addTile:completionHandler: 后立即发生。调用永远不会返回,不会产生错误。

关于如何解决这个问题的任何建议?

【问题讨论】:

  • 我只涉足 iOS 开发,所以我可能无法直接回答您的问题。当您使用 Band SDK 添加 Tile 时,它​​将尝试向用户显示确认对话框。可能是您的控制器堆栈与 Band SDK 如何定位合适的控制器以添加其自己的视图控制器的方式不一致。您可能需要提供更多设置视图控制器的 sn-ps,以查看在其加载/显示过程中您尝试添加磁贴的方式/时间。
  • @phil-hoff-msft,感谢您的关注。这是a sample。我修改了 iOS SDK 下载中包含的示例以包含一个临时视图,从而使用户界面不是根视图控制器。存在同样的问题。
  • 这是一个已知问题,因为 SDK 试图在根视图控制器上显示确认对话框,即使它不是视图层次结构的一部分。目前唯一的解决方法是确保在调用 addTile: 时显示根视图控制器。
  • 谢谢 Manjit,有计划解决这个问题吗?我的 rootviewcontroller 由故事板定义,它恰好是带有徽标等的启动视图。该应用程序不是专门为 Band 编写的,但我想为用户提供一个选项,以向 Band 发送通知和一些其他信息,因为他们已经按照 Apple Watch 的方式发送通知和一些其他信息。这将通过设置视图进行控制,如原始问题中的层次结构中所述。我看不出在这个用例中如何从 rootviewcontroller 添加磁贴。
  • @chortik 请下载最新的 SDK,如果您仍然遇到问题,请告诉我们。

标签: ios cocoa-touch microsoft-band


【解决方案1】:

您将需要获取根视图控制器并从该视图控制器执行 segue。调试起来可能会非常令人沮丧,但这里有一些关于这个主题的答案。

当应用收到推送通知时,我使用以下代码执行从根视图控制器到屏幕的 segue。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"YourStoryboard" bundle:nil];

YourViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"viewcontrolleridentifier"];

UIViewController *top = [UIApplication sharedApplication].keyWindow.rootViewController;

[top presentViewController:viewController animated:YES completion: nil];

这是 swift 中相同的代码:

let storyboard = UIStoryboard.init(name: "YourStoryboard", bundle: nil)

let viewController = storyboard.instantiateViewController(withIdentifier: "viewcontrolleridentifier")

let top = UIApplication.shared.keyWindow?.rootViewController

top?.present(viewController, animated: true, completion: nil)

确保您在情节提要中设置了视图控制器标识符。

EDIT* 如果您正在访问的视图控制器嵌入在导航控制器中,您将需要修改上述代码,

目标 C:

UIViewController *top = [self topMostController];

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

[top presentViewController:navigationController animated:YES completion: nil];

斯威夫特:

let top = UIApplication.shared.keyWindow?.rootViewController

let navigationController = UINavigationController.init(rootViewController: viewController)

top?.present(navigationController, animated: true, completion: nil)

【讨论】:

    猜你喜欢
    • 2012-08-05
    • 2014-06-01
    • 1970-01-01
    • 2016-01-06
    • 2015-04-27
    相关资源
    最近更新 更多