SwiftUI-List-UIViewRepresentableWon';不能更新
在我的列表中,如果UIViewRepresentable是列表中的唯一项,则不会更新它。如果我在其中添加文本,它就会工作。要查看效果,请再次上下滚动。 我做错了什么 这是我的密码:SwiftUI-List-UIViewRepresentableWon';不能更新,swiftui,Swiftui,在我的列表中,如果UIViewRepresentable是列表中的唯一项,则不会更新它。如果我在其中添加文本,它就会工作。要查看效果,请再次上下滚动。 我做错了什么 这是我的密码: struct Test : UIViewRepresentable { var text : String func makeUIView(context: UIViewRepresentableContext<Test>) -> UILabel { UILabe
struct Test : UIViewRepresentable {
var text : String
func makeUIView(context: UIViewRepresentableContext<Test>) -> UILabel {
UILabel()
}
func updateUIView(_ uiView: UILabel, context: UIViewRepresentableContext<Test>) {
uiView.text = text
}
typealias UIViewType = UILabel
}
class Data : ObservableObject {
@Published var names = UIFont.familyNames
}
struct ContentView : View {
@EnvironmentObject var data : Data
var body: some View {
VStack {
List(data.names, id: \.self) { name in
Test(text: name)
// Text(name) // as soon as you comment this out, it works
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
结构测试:UIViewRepresentable{
变量文本:字符串
func makeUIView(上下文:UIViewRepresentableContext)->UILabel{
UILabel()
}
func updateUIView(uiView:UILabel,context:UIViewRepresentableContext){
uiView.text=文本
}
typealias UIViewType=UILabel
}
类数据:ObserveObject{
@已发布的变量名称=UIFont.familyNames
}
结构ContentView:View{
@环境对象变量数据:数据
var body:一些观点{
VStack{
列表(data.names,id:\.self){name in
测试(文本:名称)
//Text(name)//只要你把它注释掉,它就会工作
}
}
}
}
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView()
}
}
目前我知道可以使用的变体/变通方法(在所有可用的Xcode 11.x上进行了测试)
var主体:一些视图{
VStack{
列表(data.names,id:\.self){name in
Test(text:name).id(name)//当UIViewRepresentable是ListConfirm问题中的唯一视图时,我运行了一份代码副本,一切正常。在版本11.2.1(11B500)上测试。如果列表被ScrollView/ForEach替换,则会正确更新,因此这似乎是列表的问题。是的,这不是一个答案或解决方案,而是缩小问题范围的调查结果。而且,正如(观察视图层次结构)所示,问题完全在重复使用的单元格中。在Xcode 11.3 beta(11C24b)上测试.现在它已更新,但…更新后,虽然它是可见的,但它丢失了前导填充,所以看起来有点难看。我建议提交雷达。
var body: some View {
VStack {
List(data.names, id: \.self) { name in
Test(text: name).id(name) // << here !!
}
}
}