将UITextView的inputview属性从自定义视图更改为nil会导致崩溃

Haj*_*kri 9 crash uitextview ios inputview ios7

我相信我在iOS 7中遇到了一个错误.当UITextView包含在模态视图中时,将其inputview属性从自定义视图更改为nil(为了恢复系统键盘)将导致应用程序崩溃在模态视图被驳回后.

此崩溃仅发生在iOS 7下.以前的iOS版本没有出现此问题.

我写了一个小样本应用来演示这个问题.编译启动应用程序并执行以下操作:

  1. 点击"显示TextView"按钮.这将呈现一个包含UITextView和三个按钮的模态ViewController.
  2. 点击"将inputview设置为emptyView"按钮.这将创建一个空的UIView并将其分配给UITextView的inputview属性.
  3. 点击"将输入视图设置为零"按钮.这将为UITextView的inputview属性指定nil.这样做是为了显示系统键盘.
  4. 点击"关闭ViewController"按钮.这将关闭视图控制器以返回到原始视图控制器.

一旦ViewController被解除,应用程序立即崩溃.崩溃日志有时(但不总是)指的是发送到对象的无法识别的选择器.每次重现崩溃时,对象的类型都不同.

还有其他人遇到过这种错误吗?

小智 5

对不起,我不太了解你.这是一个不会导致崩溃的解决方案.

UIView* emptyView;

-(IBAction)setToEmpty:(id)sender {
    [self.textView resignFirstResponder];
    if (emptyView == nil)
        emptyView = [[UIView alloc] initWithFrame:CGRectZero];
    self.textView.inputView = emptyView;
    [self.textView becomeFirstResponder];
//    emptyView = nil;    // If you comment out the this line, the app will crash
}
Run Code Online (Sandbox Code Playgroud)

如果启用zombie对象,则可以看到以下错误:

CrashTest [16706:a0b] * - [UIView _overrideInputViewNextResponderWithResponder:]:发送到解除分配的实例0x8e88680的消息

ios7中的ARC以不同的方式工作.显然你不能在关闭mainView之前释放对象,即firstResponder.


小智 1

@implementation NoKbTextField

static UIView *customInput;

- (UIView *) inputView {

    if (customInput == nil) {
        customInput = [[UIView alloc] init];
        customInput.backgroundColor = [UIColor clearColor];
    }
    return customInput;
}
Run Code Online (Sandbox Code Playgroud)