SwiftUI List () не показывает .children в macOS

Обновлять

Я пытаюсь использовать иерархическое представление 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)
                }
            }
          
        }
    }
}

Вот аннотированный снимок экрана, на котором выделено место / место отсутствующей стрелки раскрытия дерева. SwiftUI List () не показывает .children в macOS

Исходный вопрос

Я пытаюсь использовать иерархическое представление 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, все работает как положено:

мой код выше в симуляторе iOS

Не уверен, в чем проблема, которую вы просите о решении - просто попробовал оба фрагмента кода из пустого проекта SwiftUI - оба фрагмента работают на каждой MacOS и iOS.

rohanphadte 07.04.2021 22:27

Интересно, это что-то, специфичное для Xcode или версии ОС. Я немного сузил круг вопросов. Я отредактирую сообщение с новой информацией: я обнаружил, что если первый элемент на верхнем уровне списка не имеет дочерних элементов, он не отображается как иерархический список.

ParcelCloak 07.04.2021 23:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
42
1

Ответы 1

Ваш код работает должным образом в MacOS. Все три списка показывают правильные расширяемые дочерние элементы.

Вы можете попробовать перезапустить / обновить XCode. Одна особенность заключается в том, что стрелки появляются справа на скриншоте выше, а в посте - слева. Есть ли определенные настройки языка / локали / форматирования, которые вы добавили в свой проект и не вошли в приведенный выше фрагмент?

Кстати, в написанном коде метки для дочерних элементов nil поменялись местами с пустыми дочерними элементами. Чтобы уточнить, tree1 - это тот, у которого есть дочерние элементы nil, в то время как у tree2 есть пустые дочерние элементы. На приведенном выше снимке экрана показан исходный неизмененный код OP.

Я считаю, что у меня последняя версия MacOS и Xcode [11.2.3 и версия 12.4 (12D4e) соответственно]

ParcelCloak 08.04.2021 00:13

rohanphadte: Вы правы насчет замены nil и empty. Спасибо! И спасибо за предложения. Я считаю, что у меня есть последние версии MacOS и Xcode [11.2.3 и версия 12.4 (12D4e) соответственно]. Ни перезапуск Xcode, ни вырезание и вставка этого кода в новый проект Xcode ничего не изменили. Насколько мне известно, я не устанавливал никаких настроек языка, локали или форматирования. Может ли это иметь какое-то отношение к Big Sur / Mac Catalyst?

ParcelCloak 08.04.2021 00:20

Другие вопросы по теме