InputAccessoryView 的 viewWillDisappear:iOS 9 早期调用的方法

Posted

技术标签:

【中文标题】InputAccessoryView 的 viewWillDisappear:iOS 9 早期调用的方法【英文标题】:InputAccessoryView's viewWillDisappear: method called early in iOS 9 【发布时间】:2015-09-04 20:53:22 【问题描述】:

我在 ios 9 中遇到了一个非常不幸的错误。似乎当您设置 UITextField.inputAccessoryView 时,该视图的 viewWillDisappear:viewDidDisappear: 方法被过早调用(就在键盘完成动画时)。

我已经包含了一个 gif 来演示这个问题。当视图变为红色时,它的viewWillDisappear: 方法已被调用。奇怪的是,当您关闭键盘时,viewWillDisappear:viewDidDisappear: 会再次被调用。但是,viewWillAppear: 只被调用一次。

有没有人遇到过类似的问题?我使用viewWillDisappear:viewDidDisappear: 来关闭控制器,显然提前调用会导致不必要的行为。

注意:下面是我如何创建和设置附件视图。 AccessoryViewController.m 中没有什么值得注意的。在一个干净的项目中重现了这个问题。它在 iOS 8 上不存在。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
    if (self.textField.inputAccessoryView == nil) 
        self.textField.inputAccessoryView = self.vc.view;
    
    return YES;


- (UIViewController *)vc 
    if (!_vc) _vc = [[AccessoryViewController alloc] init];
    return _vc;

【问题讨论】:

我的一个 inputAccessoryViews 看到了同样的情况 iOS 9 GM 种子中仍然存在问题。我已经采用了一种解决方法,它在 UITextFieldDelegate 的 textFieldDidEndEditing: 方法的 inputAccessoryView 上设置了一个 BOOL。然后在我的 viewWillDisappear:viewDidDisappear: 方法中,我在关闭控制器之前检查 BOOL 是否已设置。 【参考方案1】:

AccessoryViewController 没有强存储在 ViewController 上。将其存储在实例变量中,以免被清理。

我的解决方案(斯威夫特):

var accessoryView: AccessoryViewController! // works

weak var accessoryView: AccessoryViewController!

【讨论】:

我已经强烈存储了UIViewControllerUITextField's inputAccessoryView 还创建了对 UIViewController's 视图的强引用,因此它不应该被丢弃。 我看到了这个问题,遗憾的是这个解决方案对我有用。

以上是关于InputAccessoryView 的 viewWillDisappear:iOS 9 早期调用的方法的主要内容,如果未能解决你的问题,请参考以下文章

UISearchBar作为inputAccessoryView时的响应链

作为 UITextView inputAccessoryView 的 SwiftUI 视图具有不正确的框架

没有为 UITextField 正确添加 inputAccessoryView

inputAccessoryView 现在是只读的吗?

inputAccessoryView 没有被移除

如何将 UILabel 放在键盘的“inputAccessoryView”中?