我有一个 uiviewcontroller,我在其中放置了一个带有自定义单元格的 uitableview。这些单元格中的每一个都在一个 uicollectionview 中,并带有水平滚动条。
我以编程方式工作,所以 tableviewcell 是 collectionview 的委托/数据源。
我的数据源的结构,是一个阵列的阵列。
我的 tableview 对于每个 tableviewcell 都有一个 tableview section.Tableview 数据源方法使用array没有问题。我能够正确设置 tableview。在这个单元格内,我想显示一个带有水平滚动的集合视图。
我遇到的问题是我无法使用数组正确分配数据源到 collectionview。发生的情况是,当我加载 tableview 并向下滚动时,我看到重复的记录,因此例如前 3 行显示正确(就数据和项目数而言),但是从第 4 行开始,例如,数据是重复,所以我再次看到前 3 行的记录,当然这不必发生,因为如果我滚动第 4 行(第 4 行的集合视图),应用程序会由于索引问题而崩溃范围。
这很容易理解:假设我在第一行有 10 个单元格,在第 4 行/或部分有 5 个单元格,根据您的喜好......滚动第 4 行的集合视图将导致崩溃。这是因为错误的数据实际上与第一行相同:相反,我只有 5 个单元格要呈现...
我使用的技术非常简单:为每个 tableviewcell 的标签指定实际的 indexpath.section。然后在 collectionview 中,使用此标签循环遍历数组,然后使用 indexpath.item 来获取正确的数组。
现在让我们来看看代码:
表视图
func numberOfSections(in tableView: UITableView) -> Int {
return DataManager.shared.datasource.count
}
func tableView(_ tableView: …Run Code Online (Sandbox Code Playgroud) 考虑 SwiftUI 中的以下扩展:
extension Text{
func applyBG() -> some View {
self
.padding(20)
.background(Color(hue: 0, saturation: 0, brightness: 0.22).cornerRadius(10))
.foregroundColor(.white)
}
}
extension TextField{
func applyBG() -> some View {
self
.padding(20)
.background(Color(hue: 0, saturation: 0, brightness: 0.22).cornerRadius(10))
.foregroundColor(.white)
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得我可以写得更好,避免重复。我可能可以用类似的方法解决这个问题:
extension View{
func applyBG() -> some View {
self
.padding(20)
.background(Color(hue: 0, saturation: 0, brightness: 0.22).cornerRadius(10))
.foregroundColor(.white)
}
}
Run Code Online (Sandbox Code Playgroud)
但我不希望我所有的观点都能够调用这个方法。我只希望 Text 和 Textfield 有这样的方法。我尝试使用协议和关联类型,但我无法一次编写这些行以实现干净的代码。关于如何实现 DRY 的任何提示或伪代码?