0

我的目标是在键盘成功实例化时向 iOS 键盘展示该方法presentViewController:animated:completion,利用平滑向上的动画。

一些非常简短的背景:键盘扩展项目是用 Objective-C 编写的,KeyboardViewController.h/.m处理逻辑和一些基本的视图布局inputView.xib

基于这个SO question,一些答案建议使用 call presentViewControllerfrom的方法[UIApplication sharedApplication].keyWindow.rootViewController。问题是,由于这是一个 iOS 扩展,当我尝试复制此方法时,我得到了sharedApplication不可用的错误。我想知道是否存在一种解决方法,我可以presentViewController通过它本身或通过super? 在我目前的尝试中,调用[self presentViewController: self...]会导致异常。

非常感激!

4

1 回答 1

1

这是不可能的。

实际上可以很容易地获得参考[UIApplication sharedApplication],最直接的(尽管可能会在 App Store 审查中让你被拒绝)是:

  Class appClass = NSClassFromString(@"UIApplication");
  id app = [appClass performSelector:@selector(sharedApplication)];

在 iPhone 5 模拟器上运行,从主输入视图控制器的方法调用时[app keyWindow]返回。nilviewDidAppear:

[UIApplication windows],但是,没有,所以我们可以尝试

[[[app windows].firstObject rootViewController] presentViewController:self
                                                                   animated:YES
                                                                 completion:nil];

...但它只是抛出一个异常:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图以模态方式呈现活动控制器。”

从 开始遍历视图层次结构UIApplication windows]揭示了一个有趣的事实:我们的窗口UIInputViewController 不在此窗口层次结构中。self.view.window返回一个单独_UIHostedWindow的 no superView

此外,从[UIApplication sharedApplication].

结论:UIApplication我们从中得到的sharedApplication是我们的进程,而不是主机进程。因此,在它拥有的视图和窗口上呈现是没有意义的,因为它的视图对用户是不可见的。

于 2015-10-21T03:08:30.693 回答