如何使用presentViewController呈现iOS键盘扩展

时间:2015-10-18 05:59:02

标签: ios objective-c keyboard ios-keyboard-extension

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

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

根据此SO question,有几个答案建议使用presentViewController调用[UIApplication sharedApplication].keyWindow.rootViewController的方法。问题是,因为这是iOS扩展,当我尝试复制此方法时,我收到sharedApplication不可用的错误。我想知道是否存在一种解决方法,我可以使用方法presentViewController呈现键盘,无论是通过自身还是通过super?在我目前的尝试中,调用[self presentViewController: self...]会导致异常。

非常感谢!

1 个答案:

答案 0 :(得分:1)

无法完成。

实际上可以轻松获得对 <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" style="@android:style/Widget.ProgressBar.Small" android:layout_marginRight="5dp" /> 的引用,最简单的(尽管可能会在App Store审核中被拒绝)将是:

[UIApplication sharedApplication]

在iPhone 5模拟器上运行时, Class appClass = NSClassFromString(@"UIApplication"); id app = [appClass performSelector:@selector(sharedApplication)]; 在从主输入视图控制器的[app keyWindow]方法调用时返回nil

然而,

viewDidAppear:没有,所以我们可以尝试

[UIApplication windows]

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

  

***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'应用程序试图呈现   modally一个活跃的控制器。'

[[[app windows].firstObject rootViewController] presentViewController:self animated:YES completion:nil]; 开始走视图层次结构揭示了一个有趣的事实:我们UIApplication windows] 的窗口不在此窗口层次结构中UIInputViewController会返回单独的self.view.window,但不会返回_UIHostedWindow

此外,从superView返回的窗口内存地址的应用程序之间没有差异。

结论:我们从[UIApplication sharedApplication]获得的UIApplication是我们流程的sharedApplication,而不是主机流程。因此,呈现它拥有的视图和窗口是没有意义的,因为用户看不到它的视图。