Я пытаюсь использовать иерархическое представление List
в SwiftUI
(List( tree, children:)
). Я обнаружил, что если у первого элемента списка нет дочерних элементов, отображается только верхний уровень иерархии. Мне это кажется ошибкой в SwiftUI. Интересно, знает ли кто-нибудь о хорошем исправлении.
[Это лучшая версия моего вопроса, использующая тот же тип struct
и те же элементы массива]
@main
struct bug_reportApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct FileItem: Hashable, Identifiable, CustomStringConvertible {
var id: Self { self }
var name: String
var children: [FileItem]? = nil
var description: String {
return name
}
}
let tree0: [FileItem] = [
FileItem(name: "users", children:
[FileItem(name: "user1234", children:
[FileItem(name: "Photos", children:
[FileItem(name: "photo001.jpg"),
FileItem(name: "photo002.jpg")]),
FileItem(name: "Movies", children:
[FileItem(name: "movie001.mp4")]),
FileItem(name: "Documents")
]),
FileItem(name: "newuser", children:
[FileItem(name: "Documents", children: [])
])
]),
FileItem(name: "private", children: nil)
]
let tree1 = [tree0[1], tree0[0]]
let tree2 = [FileItem(name: "private", children: []), tree0[0]]
struct ContentView: View {
var body: some View {
HStack{
VStack{
Text("Works").font(.headline)
List(tree0, children: \.children) { item in
Text(item.description)
}
}
VStack{
Text("First element has empty .children").font(.headline)
List(tree2, children: \.children) { item in
Text(item.description)
}
}
VStack{
Text("First element has nil .children").font(.headline)
List(tree1, children: \.children) { item in
Text(item.description)
}
}
}
}
}
Вот аннотированный снимок экрана, на котором выделено место / место отсутствующей стрелки раскрытия дерева.
Я пытаюсь использовать иерархическое представление List
в SwiftUI
(List( tree, children:)
).
Я не понимаю, почему в моем простом примере здесь отображаются только 3 элемента верхнего уровня 3, без маленькой стрелки для расширения подсписка под элементом списка №2.
Я могу вырезать и вставлять примеры очень похоже на вид (в тот же проект, в тот же файл), и они работают ... но я не вижу разницы!
Мой код, который не работает:
import SwiftUI
struct TreeIndexNode: Hashable, Identifiable, CustomStringConvertible {
var id: Int
var children: [TreeIndexNode]? = nil
var description: String {
return String("\(id)")
}
}
struct ContentView: View {
let tree: [TreeIndexNode] = [ TreeIndexNode(id: 1), TreeIndexNode(id: 2, children: [
TreeIndexNode(id: 3),
TreeIndexNode(id: 4),
]),
TreeIndexNode(id: 8),
]
var body: some View {
List( tree, children: \.children) { row in
Text(row.description)
}
}
}
но если я переключу его на этот пример со страниц Apple Developer, он будет работать так, как ожидалось:
struct ContentView: View {
struct FileItem: Hashable, Identifiable, CustomStringConvertible {
var id: Self { self }
var name: String
var children: [FileItem]? = nil
var description: String {
switch children {
case nil:
return "? \(name)"
case .some(let children):
return children.isEmpty ? "? \(name)" : "? \(name)"
}
}
}
let fileHierarchyData: [FileItem] = [
FileItem(name: "users", children:
[FileItem(name: "user1234", children:
[FileItem(name: "Photos", children:
[FileItem(name: "photo001.jpg"),
FileItem(name: "photo002.jpg")]),
FileItem(name: "Movies", children:
[FileItem(name: "movie001.mp4")]),
FileItem(name: "Documents", children: [])
]),
FileItem(name: "newuser", children:
[FileItem(name: "Documents", children: [])
])
]),
FileItem(name: "private", children: nil)
]
var body: some View {
List(fileHierarchyData, children: \.children) { item in
Text(item.description)
}
}
}
Я начал с шаблона проекта Xcode 12.4 "Multiplatform". Вот как это выглядит в MacOS:
Снимок экрана неработающей сборки MacOS моего кода выше
Когда я собираю для iOS, все работает как положено:
Интересно, это что-то, специфичное для Xcode или версии ОС. Я немного сузил круг вопросов. Я отредактирую сообщение с новой информацией: я обнаружил, что если первый элемент на верхнем уровне списка не имеет дочерних элементов, он не отображается как иерархический список.
Ваш код работает должным образом в MacOS. Все три списка показывают правильные расширяемые дочерние элементы.
Вы можете попробовать перезапустить / обновить XCode. Одна особенность заключается в том, что стрелки появляются справа на скриншоте выше, а в посте - слева. Есть ли определенные настройки языка / локали / форматирования, которые вы добавили в свой проект и не вошли в приведенный выше фрагмент?
Кстати, в написанном коде метки для дочерних элементов nil поменялись местами с пустыми дочерними элементами. Чтобы уточнить, tree1
- это тот, у которого есть дочерние элементы nil
, в то время как у tree2
есть пустые дочерние элементы. На приведенном выше снимке экрана показан исходный неизмененный код OP.
Я считаю, что у меня последняя версия MacOS и Xcode [11.2.3 и версия 12.4 (12D4e) соответственно]
rohanphadte: Вы правы насчет замены nil и empty. Спасибо! И спасибо за предложения. Я считаю, что у меня есть последние версии MacOS и Xcode [11.2.3 и версия 12.4 (12D4e) соответственно]. Ни перезапуск Xcode, ни вырезание и вставка этого кода в новый проект Xcode ничего не изменили. Насколько мне известно, я не устанавливал никаких настроек языка, локали или форматирования. Может ли это иметь какое-то отношение к Big Sur / Mac Catalyst?
Не уверен, в чем проблема, которую вы просите о решении - просто попробовал оба фрагмента кода из пустого проекта SwiftUI - оба фрагмента работают на каждой MacOS и iOS.