首页 > 解决方案 > 当列表没有项目时强制视图卸载或不显示

问题描述

我有一个NavigationLink基于数组成员建立的列表。当您单击列表项时,下一个视图会加载到右侧,显示该特定项的数据。删除项目时,会显示下一个项目。但是,当您删除列表中的所有项目时,最后一个项目的数据仍留在加载的视图中。我试图查看选定的项目为零,或者检查是否选择了某些其他形式,或者列表至少有一个项目,但我不知道如何检查所有这些并卸载视图。

这是代码:

        @State var selectedNoteId: UUID?

        NavigationView {
            List(data.notes) { note in
                NavigationLink(
                    destination: NoteView(note: note),
                    tag: note.id,
                    selection: $selectedNoteId
                ) {
                    VStack(alignment: .leading) {
                        Text(note.text.components(separatedBy: NSCharacterSet.newlines).first!).font(.body).fontWeight(.bold)
                        Text(note.dateText).font(.body).fontWeight(.light)
                    }
                    .padding(.vertical, 10)
                }
            }
            .listStyle(InsetListStyle())
            .frame(minWidth: 250, maxWidth: .infinity)

            Text("Select a note or create a new one...")
                .frame(maxWidth: .infinity, maxHeight: .infinity)
        }
        .navigationTitle("A title")

如何卸载NoteView并返回显示Text("Select a note or create a new one...")

谢谢您的帮助!

编辑:

这就是我删除数据的方式:

func removeNote() {
        if let selection = selectedNoteId,
           let selectionIndex = data.notes.firstIndex(where: { $0.id == selection }) {
            //print("DEBUG: delete item: \(selectionIndex)")
            data.notes.remove(at: selectionIndex)
        }
    }

标签: swiftswiftui

解决方案


你可以用if

NavigationView {
    if !data.notes.isEmpty {
        List(data.notes) { note in
            NavigationLink(
                destination: NoteView(note: note),
                tag: note.id,
                selection: $selectedNoteId
            ) {
                VStack(alignment: .leading) {
                    Text(note.text.components(separatedBy: NSCharacterSet.newlines).first!).font(.body).fontWeight(.bold)
                    Text(note.dateText).font(.body).fontWeight(.light)
                }
                .padding(.vertical, 10)
            }
        }
        .frame(minWidth: 250, maxWidth: .infinity)
    } else {
        List(data.notes) { _ in EmptyView() }
    }
    Text("Select a note or create a new one...")
        .frame(maxWidth: .infinity, maxHeight: .infinity)
}
.listStyle(InsetListStyle())
.navigationTitle("A title")
.onAppear {
    DispatchQueue.main.async {
        selectedNoteId = data.notes.first?.id
    }
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        data.notes.removeAll()
    }
}

为空时notes,不调用列表的内容。通过不关闭旧的导航链接,看起来 macOS 非常有问题


推荐阅读