【发布时间】:2021-02-19 09:52:10
【问题描述】:
我有使用自动布局的视图。我知道我希望每个视图的确切宽度(每个宽度都不同)。 StackView 嵌套在集合视图中。堆栈视图中的视图是从主视图控制器动态加载的。我想在集合视图重新加载时更新堆栈视图视图,而不删除视图并再次添加它们。我无法删除视图并重新添加它们,因为某些视图具有文本字段,如果重新加载它们会关闭键盘。我已经解释了下面的代码
感谢您的帮助。
编辑
这是我正在寻找的布局。
我使用Carbon 将视图呈现到集合视图中:
private func render() {
renderer.render {
Section(
id: "testing row collection",
cells: {
Row(id: "row id", data: [
Input(
id: 6,
props: InputContent.State(
text: self.state.inputText,
placeholder: "Search",
size: .medium
),
onChange: { [weak self] text in
print("text is:", text)
self?.state.inputText = text
}
)
])
}
)
}
}
注意:图像和代码与实现不匹配。图片显示3个视图,代码只显示1个。
Row 类是呈现包含 UIStackView 的视图的类。在里面我有一个视图列表,目前只有 1 个视图。它将text 设置为self.state.inputText,这是视图控制器中的一个变量。然后在文本字段中的任何更改我将self.state.inputText 设置为该文本。当设置变量state 时,运行render()。
Row 类:
这个类渲染实际的 UIView,它被称为RowContent。它调用RowContent 类中显示的updateState(state:) 方法。当集合视图呈现时调用它
RowContent 类:
class RowContent: UIView {
var stack: UIStackView
var state: State
struct State {
var views: [UIView] = [UIView]()
}
public func updateState(_ state: State? = nil) {
self.state = state ?? self.state
//updateView()
}
required init(state: State) {
self.state = state
self.stack = UIStackView(arrangedSubviews: state.views)
super.init(frame: .zero)
self.setupStackView()
}
...
}
堆栈视图在初始化程序中填充视图,然后我在setupStackview()中添加约束
目前,当集合视图重新呈现时,视图永远不会更新,这意味着 Input 中的 text 属性永远不会更新。我想在集合视图重新呈现时更新视图。这将在被注释掉的updateView() 方法中。我不知道如何在不删除视图并重新添加它们的情况下更新 collectionView 中的视图。
谢谢。
我在这里添加了一个例子:https://github.com/4ndrewHarri5/ExampleRow
【问题讨论】:
-
有点困惑...不管您的尺寸问题如何,您是否需要使用集合视图?或者堆栈视图(一旦您了解如何在不关闭键盘的情况下更新排列的子视图的高度)就足够了?
-
嗨,我不需要使用集合视图,最好使用堆栈视图。谢谢
-
OK - 你的目标是拥有一个水平滚动的stackView吗?如果您显示您正在尝试实现的布局的图像会有所帮助...
-
嗨@DonMag,我已经更新了问题,谢谢
-
您的图像是否显示 3 个“列”?哪里,第 1 列和第 3 列大小相等,而中间列更宽?而且,什么是可编辑的,可以调出键盘?搜索“细胞”?中间单元格?第一列和第二列是否显示相同的文本,或者可能不同?而且,这最终会有一系列看起来像这样的“行”吗?
标签: swift uicollectionview autolayout