【发布时间】:2020-10-09 09:12:48
【问题描述】:
你好。我正在构建具有复杂 UITableViewCell 的航班预订应用程序。基本上,它是带有阴影的简单卡片,有一堆堆栈视图。第一个stackview,您在图像上看到它是用于标签的。它是水平的和动态的。下一个 stackview 显示航班。它具有复杂的自定义视图,但为了简单起见,它以绿色边框显示。它也是动态的,所以我需要单独的stackview。下一个堆栈视图适用于可以处理此预订的航空公司。我称他们为操作员。它也是动态的,所以我为它们构建了另一个 stackview。所有这些堆栈视图都在一些核心堆栈视图中。你可能会问,为什么我创建了单独的堆栈视图而不是一个?因为,上面的标签可以隐藏。而且所有堆栈视图中的间距也不同。
-
这是一个非常复杂的设计。我遵循上述方法并构建 UITableViewCell。但是性能真的很差。原因很简单:我在 cellForRowAt 中做了太多的事情。每次出列单元格时都会调用 UITableViewCell 的
configure方法。这意味着我应该每次都清理我的堆栈视图,然后才附加我的视图。我认为这确实会影响性能。我不告诉单元格内的其他 if/else 语句。第一个问题是在这种情况下如何提高 UITableViewCell 的滚动性能? -
一些开发者认为 UITableView 应该被杀掉。 UICollectionView 统治着世界。好的,但是我可以在这种设计中使用 UICollectionView 吗?是的,当然,但上面的卡片将是一个 UICollectionViewCell,我根本不会避免问题。另一种解决方案是为标签(参见图片)、航班和运营商构建单独的 UICollectionViewCell。这肯定会提高性能。但是,我怎样才能让它们都住在卡片里呢?
附:我的 cellForRowAt 方法里面有什么?只有一个 configure 方法和为闭包赋值。但是配置方法相当复杂。它得到一些具有大量计算属性的协议。我将该协议的实现传递给configure 方法。协议是这样的:
protocol Booking {
var flights: [Flight] { get }
var operators: [Operator] { get }
var labels: [Label] { get }
var isExpanded: Bool { get set }
}
该协议的实施也很复杂。有一堆映射函数和 if/else 语句。一些字符串操作。那么,这会导致问题吗?我该如何解决?通过避免计算属性而只将属性(航班、运算符)传递给实现?
【问题讨论】:
-
如果不显示您的细胞有多“复杂”,就很难提供帮助。一种可能性:不是每次都删除/重新添加子视图,而是只删除额外的子视图或添加新的子视图。此外,如果您将拥有最多 10 个“操作员”,您可以在实例化单元格时创建 10 个操作员标签(或视图,无论它们是什么),然后根据需要显示或隐藏。而且,根据您认为非常糟糕的性能,您可能需要重新考虑您的设计方法。
-
我在单元格中有配置方法,例如,我在其中传递航班数组、运算符数组。然后我将它们添加到stackview。那么,我怎么知道哪些已经添加了呢?检查排列的子视图长度?但是 UITableView 调用 cellForRowAt 来重用单元格,所以我想如果我检查长度,一些视图会在那里清空。
标签: ios swift uitableview uicollectionview