我的目标是在键盘成功实例化时使用方法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...]
会导致异常。
非常感谢!
答案 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
,而不是主机流程。因此,呈现它拥有的视图和窗口是没有意义的,因为用户看不到它的视图。