我正在开发一个具有键盘扩展的应用程序,在键盘扩展的某些用途中(例如:当我使用切换键盘按钮时)扩展正在通过viewDidDisappear并且在这种情况下我知道我可以清理键盘和它的所有视图都被释放,内存被释放。在其他用途(例如:当使用 Notes 应用程序并按下 Done/Back 按钮时)扩展程序正在通过viewWillDisappear但不通过viewDidDisappear,所以在这种情况下,我没有清洁键盘,因为它没有达到我的清洁方法,因此它没有被释放。
在这一点上,我希望当我通过返回到笔记返回键盘时,我会收到之前的UIInputViewController以及我已经构建的视图。
不幸的是,此时isViewLoaded()方法返回false并且我的UIInputViewController再次通过 loadView 方法,因此重新构建所有视图,结果应用程序内存增长,直到在某个时候我到达讨厌的didReceiveMemoryWarning方法回调。
我想以某种方式恢复我在首先初始化的UIInputViewController中为我的键盘创建的视图。有人知道这是否可能以及如何实现?
我正在研究restoreIdentifier来完成这项任务,如果我错了,请纠正我,但这是与普通UIViewController一起使用的,并且不能与UIInputViewController一起使用,因为不是我的 AppDelegate 负责启动它。
更新
从我所做的进一步研究中,我得出一个结论,无论您执行什么操作:
- 使用 Notes 应用程序中的完成/返回按钮。
- 切换到消息应用程序并在那里使用键盘。
- 使用“切换键盘”按钮
和其他场景一样,UIInputViewController 类总是通过 init 方法。
根据我对面向对象编程的理解,这意味着无论谁调用我的键盘来收割,都会使用构造函数来完成它,并且基本上会创建一个新的键盘实例。这意味着我永远不会在任何行为中第一次重新出现键盘时获得可用视图,并且我总是必须为新实例构建键盘视图并清理旧实例。这是正确的吗?还是有办法保留 UIInputViewController 的视图?