Навигация внутри мастера вместо деталей в SplitView в SwiftUI

У меня есть разделенное представление в моем приложении для iPad:

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                NavigationLink("Show the slave view HERE", destination: SlaveView())
                    .navigationBarTitle("Master view")
            }

            Text("Detail view")
                .navigationBarTitle("DO NOT show the slave view here")
        }
    }
}

Поэтому мне нравится, чтобы представление SlaveView открывалось в самом списке, а не в подробном представлении. Я попытался установить еще один NavigationView в Slave, а также текст под ним, а также безуспешно установил все navigationViewStyle на обоих и на каждом Master и Slave.

Это простейшее представление Slave, которое может понадобиться вам для сборки:

struct SlaveView: View {
    var body: some View {
        List {
            NavigationLink("Sub Detail view", destination: Text("Sub Detail view"))
        }
        .navigationBarTitle("Slave view")
    }
}

Итак, как я могу изменить главное (слева) представление разделенного представления вместо подробного (справа) представления?

Обратите внимание: это упрощенный воспроизводимый код. В реальном проекте используются более сложные списки для ведущего, ведомого и так далее. Кроме того, мы не хотим терять элементы навигации, такие как переходы, преобразование заголовков, кнопку возврата и т. Д.

Для большей ясности мне нужно это состояние в потоке:

Необходимый шаг


person Mojtaba Hosseini    schedule 29.07.2020    source источник


Ответы (3)


Просто измените ссылку, чтобы она не была деталью

демо

NavigationLink("Show the slave view HERE", destination: SlaveView())
    .isDetailLink(false)
person Asperi    schedule 30.07.2020
comment
+1 за указатель вправо модификатора. Но у него есть странный баг! Позвольте показать вам гифку: i.stack.imgur.com/c09sb.gif. Для этого достаточно одного щелчка - person Mojtaba Hosseini; 30.07.2020
comment
Похоже, вы активируете сразу много ссылок. Взгляните на эту тему - визуально у вас что-то похожее. - person Asperi; 30.07.2020
comment
Похоже, .listStyle(GroupedListStyle()) виноват в этой проблеме. - person Mojtaba Hosseini; 30.07.2020

Вы можете попробовать использовать Button вместо NavigationLink и заменить главное представление:

struct ContentView: View {
    @State var showSlaveView = false

    var body: some View {
        NavigationView {
            masterView
                .navigationBarTitle("Master view")
            Text("Detail view")
                .navigationBarTitle("DO NOT show the slave view here")
        }
    }
}

extension ContentView {
    @ViewBuilder
    var masterView: some View {
        if showSlaveView {
            SlaveView()
                .onTapGesture { self.showSlaveView = false }
        } else {
            Button("Show the slave view HERE") {
                self.showSlaveView = true
            }
        }
    }
}
person pawello2222    schedule 29.07.2020
comment
+1 за идею. Но он убивает все переходы навигации, переходы заголовков, кнопку назад, жест смахивания и так далее. Также в сложном приложении. Ведущее устройство и ведомые устройства представляют собой сложные списки. Что об этом? - person Mojtaba Hosseini; 30.07.2020
comment
@MojtabaHosseini Но это будет означать, что одновременно будут открыты две ссылки NavigationLink. От мастера открываешь слейв, но деталь уже открыта (тоже от мастера). Я не думаю, что в настоящее время стек навигации SwiftUI позволяет это. - person pawello2222; 30.07.2020
comment
Мне нужно что-то вроде: держать списки слева, а подробности справа. Но, к сожалению, я тоже думаю, что ты тоже. - person Mojtaba Hosseini; 30.07.2020

Вы можете попробовать использовать StackNavigationViewStyle()

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink("Show the slave view HERE", destination: SlaveView())
                .navigationBarTitle("Master view")
            
            Text("Detail view")
                .navigationBarTitle("DO NOT show the slave view here")
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}
person Christian Ray Leovido    schedule 29.07.2020
comment
Это убивает весь SplitView, а я этого не хочу. Я думаю, вы не поняли вопрос. - person Mojtaba Hosseini; 30.07.2020