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)
}
}