我正在开发一个基于 xml 文件动态创建表单的项目。一切正常,除了如果一个表单有太多的文本视图,它加载非常慢。通过 xcode Time profiler 分析应用程序性能,我了解到每当初始化 textView 时,它都会消耗大量 cpu。
为了让这个更容易理解,我创建了一个示例项目来重现这个问题。加载视图控制器时,示例项目仅添加了大约 1000 个 UItextView。我使用 xcode Profiler 检查了这段代码的性能。我能够弄清楚,如果将 UItextView 替换为 UItextField,性能会显着提高。演示项目会显示出轻微的改进,因为视图仅限于文本视图或文本字段。但在我的实际应用程序中,当我尝试加载繁重的 xml 时,我发现至少有 4 秒的改进。
示例项目: https://github.com/amrit42087/TextView_Performance
这是带有 UItextView 的 Xcode Profiler 的屏幕截图:
这是带有 UITextField 的 Xcode Profiler 的屏幕截图:
UITextfield 将加载时间从 1.49 秒减少到 960 毫秒,这是在 UItextView 的情况下。我的实际项目注意到很多改进,因为这是一个繁重的应用程序。
问题: 如果有人可以提出在使用 UItextView 时提高性能的解决方案,将不胜感激。使用 UITextField 不是一个选项,因为我需要多行文本。
默认情况下,
UITextView
正在初始化,.isSelectable
属性设置为 true
.
isSelectable
属性是一个布尔值,决定用户是否可以选择和交互UITextView
实例的文本内容。
当
isSelectable
属性设置为 true 时,用户可以通过几种方式与文本视图的内容进行交互,例如:
如果
isSelectable
属性设置为 false
,用户将无法选择任何文本或与文本视图内容中的任何链接或电话号码进行交互。isSelectable
设置为false
,文本视图仍然可以显示属性文本,您仍然可以设置和获取文本视图的文本和属性文本属性。
所以尝试禁用它,从将它设置为
false
开始,然后再将textview添加为子视图。
private func addTextView() {
let textView = UITextView(frame: .zero)
textView.isSelectable = false
view.addSubview(textView)
}
如果您仍然看到性能问题,请尝试从 xib 文件创建您的 UITextView,确保您 untick
Selectable
行为选项。
我测量了性能并得到了似乎更接近 UITextField 的结果,但是,它可能因机器硬件而异,但看起来很有希望。
UITextField
Elapsed time: 1.0315909385681152 seconds
UITextView
Elapsed time: 1.2108770608901978 seconds
如果您仍然需要它是可选的,请考虑稍后在实例化完成后进行。 希望有所帮助。