Предварительный выбор (динамического) элемента в NavigationSplitView

я используюNavigationSplitViewчтобы структурировать пользовательский интерфейс моего (macOS) приложения следующим образом:

      struct NavigationView: View {
    
    @State private var selectedApplication: Application?
    
    var body: some View {
        NavigationSplitView {
            ApplicationsView(selectedApplication: $selectedApplication)
        } detail: {
            Text(selectedApplication?.name ?? "Nothing selected")
        }
    }
}

Боковая панель реализована с использованиемApplicationsViewэто выглядит так:

      struct ApplicationsView: View {
    
    @FetchRequest(fetchRequest: Application.all()) private var applications
    @Binding var selectedApplication: Application?
    
    var body: some View {
        List(applications, selection: $selectedApplication) { application in
            NavigationLink(value: application) {
                Text(application.name)
            }
        }
        
        // This works, but looks a bit complicated and... ugly
        .onReceive(applications.publisher) { _ in
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
                if selectedApplication == nil {
                    selectedApplication = applications.first
                }
            }
        }

        // This also does not work, as the data is not yet available
        .onAppear {
            selectedApplication = applications.first
        }
    }
}

Я сейчас выбираю первыйApplicationэлемент (если он существует) с помощью показанногоonReceiveкод, но он выглядит сложным и немного некрасивым. Например, он работает правильно только при задержке кода выбора.

Есть ли лучший способ добиться этого?

Спасибо.

0 ответов

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