Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIVIEW列表中的可表示行在SwiftUI中消失_Ios_Swift_Swiftui - Fatal编程技术网

Ios UIVIEW列表中的可表示行在SwiftUI中消失

Ios UIVIEW列表中的可表示行在SwiftUI中消失,ios,swift,swiftui,Ios,Swift,Swiftui,我有以下清单: struct SignInList: View { @ObservedObject var model:SignInModel var body: some View { List(model.currentSignIns) { signIn in SignInRow(description: signIn) } } } 使用此列表行: struct SignInRow: View, Id

我有以下清单:

struct SignInList: View {
    @ObservedObject var model:SignInModel
    
    var body: some View {
        List(model.currentSignIns) { signIn in
            SignInRow(description: signIn)
        }
    }
}
使用此列表行:

struct SignInRow: View, Identifiable {
    let id = UUID()
    let description: SignInDescription
    
    var body: some View {
        VStack {
            ButtonView(view: description.button)
        }
    }
}

// Map a UIView to a View. Will be using this to hold a UIView based sign-in button
// https://developer.apple.com/tutorials/swiftui/creating-and-combining-views
struct ButtonView: UIViewRepresentable {
    let view: UIView
    
    func makeUIView(context: Context) -> UIView {
        return view
    }
    
    func updateUIView(_ uiView: UIView, context: Context) {
    }
}
但当我滚动列表时,列表中的单元格消失了:

如果我将列表单元格更改为纯SwiftUI,例如

struct SignInRow: View, Identifiable {
    let id = UUID()
    let description: SignInDescription
    
    var body: some View {
        VStack {
            Rectangle()
        }
    }
}
我没有这种效果。滚动时,单元格不会消失


我尝试了一些想法(例如,和),但到目前为止没有真正的改进。(当我在ScrollView中嵌入ForEach时,我会遇到不同的问题——我的两行中只有一行显示,按钮不再可点击)。

我认为问题在于列表重用行,因此它会从superview中删除外部注入的UIView,但之后不会再次插入它(这不是可表示的工作方式),但只是更新

通常情况下,您应该提供数据,但视图应该在
makeView
中创建,并在
updateView
中更新

下面是一些从您的代码复制的简化演示。使用Xcode 12.1/iOS 14.1进行测试

类符号模型:ObservableObject{
@已发布的变量currentSignIns=(1..UIView{
let button=ui按钮(类型:。系统)
button.setTitle(标题,用于:。正常)
返回按钮
}
func updateUIView(uiView:uiView,context:context){
}
}

我认为@Asperi走上了正确的道路,因为
列表是一个问题。我正在放弃使用它们。以下是我现在的工作:

struct SignInList: View {
    @ObservedObject var model:SignInModel
    
    var body: some View {
        ScrollView() {
            ForEach(model.currentSignIns) { signIn in
                SignInRow(description: signIn)
                    .padding(.horizontal, 20)
            }
        }
    }
}

struct SignInRow: View, Identifiable {
    let id = UUID()
    let description: SignInDescription
    
    var body: some View {
        VStack {
            ButtonView(view: description.button)
        }.frame(height: 40)
    }
}

嘿,谢谢。也许这方面的一些变化可以解决这个问题。不过我认为仍然缺少一些东西。如果您将新的
ButtonView
结构更改为具有一个构造函数,该构造函数生成
UIButton
,并在每次调用
makeUIView
时只返回相同的
UIButton
实例,这仍然适用于同样的方式。也就是说,列表单元格不会消失。
struct SignInList: View {
    @ObservedObject var model:SignInModel
    
    var body: some View {
        ScrollView() {
            ForEach(model.currentSignIns) { signIn in
                SignInRow(description: signIn)
                    .padding(.horizontal, 20)
            }
        }
    }
}

struct SignInRow: View, Identifiable {
    let id = UUID()
    let description: SignInDescription
    
    var body: some View {
        VStack {
            ButtonView(view: description.button)
        }.frame(height: 40)
    }
}