Видимость столбца SwiftUI NavigationSplitView на iPhone?

Я пытаюсь создать трехколоночный макет в SwiftUI.

Первый столбец — это LazyVGrid выбираемых элементов. Затем выбор влияет на список элементов в представлении содержимого (второй столбец), который также является не списком SwiftUI, а VStack + другими представлениями в представлении прокрутки. Выбор элементов в этом столбце влияет на подробное представление.

Я заставил все это работать на iPad, но это потому, что iPad отображает несколько столбцов одновременно, а NavigationSplitView поддерживает жесты на iPad, а также настройки видимости столбцов в коде.

Проблема в том, что я не могу найти способ программно перейти от одного столбца к другому на iPhone, поскольку он, похоже, не отвечает на привязки видимости столбца.

Сначала я работал с навигационными ссылками для каждого элемента в моей сетке, где пункт назначения был установлен на представление, но код был довольно неприятным.

В конце концов, я придумал код ниже. В первом столбце у меня есть представление сетки с настраиваемым модификатором onSelect, который я запускаю всякий раз, когда выбран элемент. Вот где я пытаюсь изменить видимость столбца. Я попытался установить vm.navigationColumnVisibility = .detailOnly, но iPhone, похоже, игнорирует это.

Я смог заставить его работать именно так, как ожидалось, изменив сетку на список. Свойство выбора/привязка в представлении списка, казалось, вызывало навигацию на iPhone. Однако это не желаемый UI/UX.

Любые советы о том, как программно вызвать навигацию между столбцами на iPhone или лучший способ адаптировать этот код для достижения описанного UI/UX?

      struct JNavSplitView: View {
    @EnvironmentObject var vm: JNavSplitViewModel
    @State private var book: Book? = nil
    @State private var entry: Entry? = nil
        
    var sheet: some View {
        #if os(macOS)
        JEntryCreateFormMacOS(book: book)
        #else
        JEntryCreateForm(book: book)
            .onCreate { entry in
                self.entry = entry
            }
        #endif
    }
    
    var body: some View {
        NavigationSplitView(columnVisibility: $vm.navigationColumnVisibility) {
            BooksGridView(selected: $book)
                .onSelect { book in
                    self.entry = book.getEntries(forDate: Date()).first
                }
        } content: {
            BookEntriesView(book: book, selected: $entry)
        } detail: {
            PageCollectionView(entry: $entry)
        }
        .navigationViewStyle(DoubleColumnNavigationViewStyle())
        #if os(macOS)
        .toolbarBackground(Color("Purple 1000"), for: .windowToolbar)
        #endif
        .environmentObject(vm)
        .sheet(isPresented: $vm.presentNewEntryForm, content: {
            sheet
        })
    }
    
}

0 ответов

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