TabbedView с использованием SwiftUI в Xcode11Beta (11M336w) - PullRequest
0 голосов
/ 14 июня 2019

Я слежу за сеансом WWDC2019 здесь:

https://developer.apple.com/videos/play/wwdc2019/216/

У меня есть следующий код, работающий для создания TabbedView с помощью SwiftUI:

// Section1 | ContentView (мой) ---------------------------

import SwiftUI

struct ContentView : View {
    var body: some View {
        NavigationView {
            TabbedView(selection: .constant(1)) {
                PlaceForm().tabItemLabel(Text("Tab1")).tag(1)
                FavoritesForm().tabItemLabel(Text("Tab2")).tag(2)
            }
        }

    }
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

// --------------------------- Выше приведено следующее представление с вкладками:

Tabbed View without image

Однако в сеансе WWDC2019 используется следующий код:

// Section2 | ContentView (Apple's) ---------------------------

import SwiftUI

struct ContentView : View {
    var body: some View {
        NavigationView {
            TabbedView(selection: .constant(1)) {
                PlaceForm().tabItemLabel {
                    Image(systemName: "square.and.pencil")
                    Text("Tab1")
                }
                FavoritesForm().tabItemLabel {
                    Image(systemName: "clock.fill")
                    Text("Tab2")
                }
            }
        }

    }
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

// ---------------------------

Однако в Xcode11Beta это приводит к следующей ошибке компилятора, генерируемой Xcode11Beta

Cannot convert value of type 'TabbedView<Int, 

TupleView<(_ModifiedContent<PlaceForm, _TraitWritingModifier<AnyView?>>, 

_ModifiedContent<FavoritesForm, _TraitWritingModifier<AnyView?>>)>>' to 

closure result type '_'

как показано на следующих скриншотах enter image description here

и

enter image description here

// ---------------------------

По какой причине код, показанный на слайдах WWDC2019, не приводит к отображению изображений на вкладках представления с вкладками, как следует ожидать, если информация в презентации WWDC2019 верна?

Кроме того, при использовании кода в разделе 1 при переключении вкладок на вкладку 2 отображается пустой вид, как описано в следующем вопросе:

SwiftUI TabbedView отображает только содержимое первой вкладки

Обратите внимание, что содержимое PlaceForm и FavoritesForm приведено ниже

// Section3 | PlaceForm ---------------------------

import SwiftUI

struct PlaceForm : View {
    var body: some View {
        List {
            VStack {
                MapView()
                    .edgesIgnoringSafeArea(.top)
                    .frame(height: 300)

                CircleImage()
                    .offset(y: -130)
                    .padding(.bottom, -130)
                VStack {
                    VStack {
                        Text("Turtle Rock")
                            .font(.title)
                            .color(.black)
                    }
                    HStack {
                        Text("Joshua Tree National Park")
                            .font(.subheadline)
                        Spacer()
                        Text("California")
                            .font(.subheadline)
                    }
                    }
                    .padding()
            }
        }.listStyle(.grouped)

    }
}

#if DEBUG
struct PlaceForm_Previews : PreviewProvider {
    static var previews: some View {
        PlaceForm()
    }
}
#endif

// Section4 | FavoritesForm ---------------------------

import SwiftUI

struct FavoritesForm : View {
    var body: some View {
        List {
            VStack {
                MapView()
                    .edgesIgnoringSafeArea(.top)
                    .frame(height: 300)

                CircleImage()
                    .offset(y: -130)
                    .padding(.bottom, -130)
                VStack {
                    VStack {
                        Text("Ninja Rock")
                            .font(.title)
                            .color(.black)
                    }
                    HStack {
                        Text("Joshua Tree National Park")
                            .font(.subheadline)
                        Spacer()
                        Text("California")
                            .font(.subheadline)
                    }
                    }
                    .padding()
            }
            }.listStyle(.grouped)

    }
}

#if DEBUG
struct FavoritesForm_Previews : PreviewProvider {
    static var previews: some View {
        FavoritesForm()
    }
}
#endif

Ответы [ 3 ]

3 голосов
/ 03 июля 2019

Эта проблема была исправлена ​​в Xcode 11 beta 3. Из Примечания к выпуску iOS & iPadOS 13 Beta 3 :

Модификатор tabItemLabel ( :) - теперь называется tabItem ( :) - теперь принимает замыкания @ViewBuilder.(51502668)

Пример:

myView()
    .tabItem {
        Image(systemName: "circle")
        Text("Tab1")
    }
0 голосов
/ 25 июня 2019

После некоторой игры кажется, что представления с вкладками еще не принимают системные изображения. Этот код скомпилирован для меня. Я использую Xcode 11.0 beta (11M336w) на Catalina 10.15 Beta (19A487m).

struct TabView : View { 
    var body: some View {
        TabbedView {
            HomeFeedUIV().tabItemLabel(Image(systemName: "house")) // doesn't work

            DatabaseHomeUIV().tabItemLabel(Image("database.unselected")) // works

            NewPostUIV().tabItemLabel(Image(systemName: "square.and.pencil")) // doesn't work
        }
    }
}

Я попытался использовать VStack для tabItemLabels (изображения и текста), но отладчик сказал, что tabItemLabels не принимает VStacks, только изображения и текст. Мне еще предстоит выяснить, как заставить текст и изображение появляться, кажется, принимает только один или другой. Я пытался использовать скобки, скобки, фигурные скобки, VStacks, ни один из них не работает. Похоже, сейчас это одно или другое.

0 голосов
/ 19 июня 2019

Я добился успеха в бета-версии 2, обернув 2 элемента управления внутри tabItemLabel с помощью VStack:

.tabItemLabel(VStack {
                    Image(systemName: "list.bullet")
                    Text("Foo").font(.title)
            })
...