Я рассматриваю, как реализован TabView в SwiftUI.

Как я вижу, он принимает только @ViewBuilder с содержимым в инициализаторе.

public init(selection: Binding<SelectionValue>?, @ViewBuilder content: () -> Content)

Я хотел бы реализовать свой собственный MyTabView, использование которого напоминает использование собственного TabView. Но подумайте, как можно передать в контент @ViewBuilder несколько представлений (экранов), а затем на основе этого параметра, т.е. закрытия, возвращающего Content, просто отображать их условно! на основе параметра выбора.

Есть ли какая-то частная реализация или есть возможность как-то этого добиться. Оригинальный TabView имеет много ограничений, которые я хотел бы обойти. Но одновременно я хотел бы придерживаться собственного использования реализации

Я хотел бы иметь что-то вроде этого подхода:

MyTabView(selection: $selection, tabs: { 
    Tab1() 
    Tab2() 
    Tab3() 
}) { 
    View1()
    View2()
    View3() 
}

Конечно, лучше всего иметь что-то вроде этого

MyTabView(selection: $selection}) { 
    View1().tabItem({})
    View2().tabItem()
    View3().tabItem() 
}

Но последний вариант кажется еще более трудным для достижения

3
Michał Ziobro 25 Ноя 2019 в 12:16
Не могли бы вы объяснить немного больше о том, что вы имеете в виду с этим последним вариантом? Вы хотите, чтобы изображение и текст панели вкладок выводились?
 – 
cbjeukendrup
25 Ноя 2019 в 16:32
Это использование SwiftUI TabView для определения tabItems. Я хотел бы определить элементы этой вкладки аналогичным образом в моей пользовательской реализации MyTabView.
 – 
Michał Ziobro
25 Ноя 2019 в 17:49

1 ответ

Хорошо, у меня есть простая версия с похожим API, например TabView. Для этого я использовал Preferences и TupleView.

Единственное, что в настоящее время не решено, — это то, как обращаться с группами.

Вот ссылка на проект github https://github.com/michzio/Click5Menu

А вот пример того, как его можно использовать:

 Click5MenuView {


            Page1()
            Page2()
            Page3()

            NavigationView {
                Text("Page 4")
                    .navigationBarTitle("Page 4", displayMode: .inline)
                    .hamburgerButton()
            }
            .menuItem {
               MenuItemView(systemImage: "person", title: "Page 4")
            }
            .withTag(3)

            NavigationView {
                Text("Page 5")
                .navigationBarTitle("Page 5", displayMode: .inline)
                .hamburgerButton()
            }
            .menuItem {
                MenuItemView(systemImage: "person", title: "Page 5")
            }
            .withTag(4)

}

struct Page1 : View {

    var body: some View {

        NavigationView {
            Text("Page 1")
            .navigationBarTitle("Page 1", displayMode: .inline)
            .hamburgerButton()
        }
        .menuItem {
            MenuItemView(systemImage: "person", title: "Page 1")
        }
        .tabBarItem {
            TabItemView(systemImage: "person", title: "Page 1")
        }
        .withTag(0)
    }
}
2
Michał Ziobro 26 Ноя 2019 в 13:13