美文网首页
记录一个UITextView Category怪异的BUG

记录一个UITextView Category怪异的BUG

作者: ElegantLiar | 来源:发表于2017-11-27 15:12 被阅读47次

    需求

    项目需求,在UGC编辑日程界面需要为UITextView添加一个Placeholder,下图红框。


    1.png

    对于iOS7以上系统,我们可以通过KVC来为UITextView的私有属性设值

       UILabel *placeHolderLabel = [[UILabel alloc] init];
        placeHolderLabel.text = @"请输入日程内容";
        placeHolderLabel.numberOfLines = 0;
        placeHolderLabel.textColor = [UIColor colorWithWhite:0 alpha:0.5];
        [placeHolderLabel sizeToFit];
        [_inputTextView addSubview:placeHolderLabel];
        placeHolderLabel.font = [UIFont systemFontOfSize:18.f];    
        [_inputTextView setValue:placeHolderLabel forKey:@"_placeholderLabel"];
    

    但是对于iOS7以上系统此方法并不适用,因项目仍然支持iOS7系统,遂换其他方式。

    问题

    后来应用category的方式,对UITextView进行扩展一个placeholaer的属性,在category内部建通知监听textView的编辑状态,来更变placeholder的显示与隐藏,最终在category的dealloc内部移除掉监听。

    在iOS7以上系统运行没有问题,但是此方法在iOS7系统上第二次进入此页面会崩溃,全局断点也无法捕捉到崩溃位置,但从崩溃原因应该是野指针相关问题,通过监视僵尸对象发现崩溃现象如下:第一次进入此界面时,假如textView对象地址为0X100003,退出时,页面走了dealloc方法。 第二次进入时,textView对象地址为0X100009,当点击textView输入文本时,崩溃,崩溃原因是0X100003地址的textView为空指针。很奇怪的是,明明第一次的textView已经释放过了,不明白为什么还会去找第一次界面的textView,后来在此控制器中,注释掉引用category文件,但是仍然有上述现象出现。

    解决方法

    经过多次实践,发现只要此category文件存在于项目中,就会出现此崩溃现象,删除之后,项目运行正常。之后通过自定义textView,监听自定义textView来控制placeholderLabel的展示隐藏实现。

    总结

    目前还不知道怎样这个bug出现的问题,在iOS7以上系统不会出现上述问题,希望有了解的可以指点一下,同时出现这个问题的可以参考我的解决方法。

    相关文章

      网友评论

          本文标题:记录一个UITextView Category怪异的BUG

          本文链接:https://www.haomeiwen.com/subject/fkldbxtx.html