需求
项目需求,在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以上系统不会出现上述问题,希望有了解的可以指点一下,同时出现这个问题的可以参考我的解决方法。
网友评论