struct ContentView : View {
var body: some View {
NavigationView {
TabbedView {
PasswordGenerator()
.tabItemLabel {
Image("KeyGlyph")
Text("Generator")
}
PasswordGeneratorSettings()
.tabItemLabel {
Image("SettingsGlyph")
Text("Settings")
}
}
}
}
}
Cela ne se compilera pas, mais il a été utilisé dans la vidéo Swift Essentials à la WWDC (voir minute 54:30)) et j'ai vu des solutions de contournement comme la solution de contournement VStack (mais même cela a de nombreux défauts , l'onglet gauche est trop loin vers la gauche et l'onglet droit est trop loin vers la droite et lorsque vous changez d'onglet, seul le premier qui a initialement chargé les charges et l'autre onglet reste vide et l'utilisation de balises n'aide pas). J'ai deux onglets qui chargent les vues et ont une image et du texte?
TabbedView()
est obsolète, utilisez TabView()
à la place.
Utiliser des nombres entiers pour sélectionner des vues me sent mauvais, depuis mes jours de travail avec tag()
de UIButton et UIView, il est préférable d'énumérer ce que vous faites plutôt que d'attribuer des valeurs codées en dur qui ont une très large plage. c'est-à-dire Int.min()
à Int.max()
. Cela facilite également la lecture et la maintenance du code à l'avenir.
TabView(selection: )
peut être utilisé pour sélectionner l'index, et est déclaré comme:
public struct TabView<SelectionValue, Content> : View where SelectionValue : Hashable, Content : View {
public init(selection: Binding<SelectionValue>?, @ViewBuilder content: () -> Content)
…
Cela signifie que vous pouvez sélectionner l'index avec n'importe quel contenu lavable.
Nous pouvons utiliser un enum
conforme à Hashable
pour contenir une liste d'onglets. De cette façon, nous pouvons utiliser un observable plus tard pour aider à contrôler et à charger l'état de la vue. Ou ayez l'énumération dans le cadre de l'état de votre application. Je suis sûr qu'il existe de nombreuses ressources que vous pouvez utiliser pour trouver une solution appropriée qui répond à vos besoins.
struct MainTabView: View {
@State private var selection: Tabs = .profile
private enum Tabs: Hashable {
case content
case profile
}
var body: some View {
TabView(selection: $selection) {
// Learn Content
Text("The First Tab")
.tabItem {
Image(systemName: "book")
Text("Learn")
}.tag(Tabs.content)
// The Users Profile View.
ProfileView()
.tabItem {
Image(systemName: "person.circle")
Text("Profile")
}.tag(Tabs.profile)
}
}
}
TabbedView est obsolète.
Vous pouvez utiliser TabView à la place maintenant
struct AppTabbedView: View {
@State private var selection = 3
var body: some View {
TabView (selection:$selection){
Text("The First Tab")
.tabItem {
Image(systemName: "1.square.fill")
Text("First")
}
.tag(1)
Text("Another Tab")
.tabItem {
Image(systemName: "2.square.fill")
Text("Second")
}.tag(2)
Text("The Last Tab")
.tabItem {
Image(systemName: "3.square.fill")
Text("Third")
}.tag(3)
}
.font(.headline)
}
}
depuis Xcode 11 GM, ce code fonctionne: (from https://developer.Apple.com/documentation/swiftui/tabview )
TabView {
Text("The First Tab")
.tabItem {
Image(systemName: "1.square.fill")
Text("First")
}
Text("Another Tab")
.tabItem {
Image(systemName: "2.square.fill")
Text("Second")
}
Text("The Last Tab")
.tabItem {
Image(systemName: "3.square.fill")
Text("Third")
}
}
.font(.headline)
TabbedView est obsolète et a été renommé TabView Vous pouvez utiliser TabView comme ceci
TabView {
(Text("Tab 1!").tabItem {
Text("First")
})
(Text("Tab 2!").tabItem {
Text("Second")
})
}
Le 'TabbedView' peut être utilisé d'une manière similaire à ce qui suit:
struct TabView : View {
@State private var selection = 1
var body: some View {
TabbedView (selection: $selection) {
InboxList()
.tabItemLabel(selection == 1 ? Image("second") : Image("first"))
.tag(1)
PostsList()
.tabItemLabel(Image("first"))
.tag(2)
Something()
.tabItemLabel(Image("first"))
.tag(3)
}
}
}
Je ne sais pas pourquoi votre exemple ne compile pas, mais vous manquez à la fois le paramètre selection
et le .tag
propriété sur chaque "onglet".
Btw dans la version actuelle de XCode (beta 2), vous ne pouvez pas afficher à la fois un texte et une image comme étiquette.