我最初问这个问题。我以为自定义视图的加载时间较慢的原因是由于将多个视图彼此叠加,或者可能是由于某些递归问题。但是,在切出越来越多的代码以查看会有什么不同之后,最终取决于我是否有UITextView礼物。因为问题的明显根源与我在第一个问题中所期望的完全不同,所以我决定开始一个新问题,而不是在旧问题上添加冗长的更新。
UITextView
我用两个视图控制器设置了测试项目。第一个视图控制器上的按钮将show segue调用给第二个视图控制器。第二个视图控制器上有我的自定义视图。(使用第二个视图控制器,使我了解了加载自定义视图所花的时间。)
自定义视图代码:
import UIKit @IBDesignable class UIMongolTextView: UIView { var textView = UITextView() // key line required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override init(frame: CGRect){ super.init(frame: frame) } }
如您所见,与a的唯一区别UIView是我添加了一个UITextView属性。正是这种自定义视图加载非常缓慢。在Instruments中运行“分配”工具,我得到以下结果(计数为997):
UIView
但是,如果我注释掉
//var textView = UITextView()
那么我的自定义视图加载速度非常快,只有7个计数。
这里发生了什么?是否可以UITextView在自定义视图中使用属性并避免这种缓慢的加载时间?
尝试过类似的操作,其中将标签和文本字段作为子视图添加到uiview子类。我的操作方式如下:
@interface CustomTextField : UIView @property (weak, nonatomic) IBOutlet UITextField *valueField; @end
因此,我们有一个xib文件,实际上在该文件上添加了标签和文本字段。在xib文件上,文件所有者为“ CustomTextField”,出口从此处与头文件链接。
构造方法如下所示:
- (id)initWithValue:(NSString *)value { self = [super initWithFrame:CGRectZero]; if (self) { NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; UIView *view = nibs[0]; self.valueField.frame = view.bounds; [self setFrame:view.bounds]; [self addSubview:view]; [self.valueField setText:value]; } return self; }
对我来说很好。