【问题标题】:Changing the inputview property of a UITextView from a custom view to nil leads to a crash将 UITextView 的 inputview 属性从自定义视图更改为 nil 会导致崩溃
【发布时间】:2013-11-11 18:27:50
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 非常感谢!您帮助我理解了将 inputView 设置为 nil 的问题。幸运的是,我们现在不能取消它。

标签: ios crash ios7 uitextview inputview


【解决方案1】:

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

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
}

如果你启用了僵尸对象,你会看到如下错误:

CrashTest[16706:a0b] * -[UIView _overrideInputViewNextResponderWithResponder:]: 消息发送到释放的实例 0x8e88680

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

【讨论】:

  • 谢谢!我在这个错误上花了 4 个小时!但我很高兴我拥有它,从中学到了很多:D
  • 为澄清起见,当您将 inputView 设置为 nil 而未先调用 resignFirstResponder 时,会发生崩溃。
  • 在我的案例中定义我的 emtpyView 全局解决了我的问题。让 emptyKeyboardView : UIView = UIView.init(frame: CGRectZero)
  • 对我来说这不起作用。相反,我使用了 self.textView.inputView=nil。还可以与stackoverflow.com/questions/11696419/… 进行比较
【解决方案2】:
@implementation NoKbTextField

static UIView *customInput;

- (UIView *) inputView {

    if (customInput == nil) {
        customInput = [[UIView alloc] init];
        customInput.backgroundColor = [UIColor clearColor];
    }
    return customInput;
}

【讨论】:

  • 感谢您的意见,但这并不能解决问题。当一个值被分配给 inputview 时会出现问题,然后在稍后的某个时间点它被分配一个 nil 以恢复系统键盘。您的代码强制 inputview 属性始终返回一个值,因此永远不会带上系统键盘。这不是我们想要的行为。
【解决方案3】:

完全一样的问题,吃了我 4 个小时。

由于某些原因我们不使用ARC,所以通常情况下,我们应该释放视图,但事实是如果你释放视图,它会崩溃:

[UIView _overrideInputViewNextResponderWithResponder:]: message sent to deallocated instance 0x8e88680

仅在 iOS 5.0.1 和 7.0 中测试过,5.0.1 就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多