SwiftUI TabView дважды вызывает функцию init - PullRequest
0 голосов
/ 05 марта 2020

Я был зол на tabview, надеюсь, что какой-нибудь гений может помочь.
По умолчанию tabview будет запускать все представления каждый раз, когда я этого не хочу, поэтому я решил их, добавив ленивое представление. Вот мой код

http://github.com/BellRinging/TestBug.git

import SwiftUI
struct TabViewIssue: View {

@State private var selected = 0

var body: some View {
    TabView(selection: $selected, content: {
        LazyView(TestPage(text:"Page1"))
            .tabItem {
                selected == 0 ? Image(systemName: "book.fill"):Image(systemName: "book")
                Text("Page1")
        }.tag(0)

        LazyView(TestPage(text:"Page2"))
            .tabItem {
                selected == 1 ? Image(systemName: "book.fill"):Image(systemName: "book")
                Text("Page2")
        }.tag(1)
        })
}
}



 struct TestPage: View {
    let text : String
    init(text : String){
        self.text = text
        print("init \(text)")
    }
    var body: some View {
        Text(text) //no issue for a sigle view
    }
}

struct LazyView<Content: View>: View {
let build: () -> Content
init(_ build: @autoclosure @escaping () -> Content) {
    self.build = build
}
var body: Content {
    build()
}

}

Работает нормально. Результатом будет «init Page1», «init Page2», если я переключаю страницу.
Затем я меняю вкладку так, чтобы она указала на TestPage2 (единственное отличие - это тело представления имеет дополнительный элемент VStack)

LazyView(TestPage2(text:"Page2"))

// Изменил приведенный выше код на TestPage2

struct TestPage2: View {
let text : String
init(text : String){
    self.text = text
    print("init \(text)")
}
var body: some View {
    VStack{ //If added a VStack ..tabview init call twice
        Text(text)
        Text(text)
    }
}

}

В результате получается
init Page2
init Page1
init Page1
init Page2

Функция init будет вызываться дважды .. Она устала

1 Ответ

0 голосов
/ 06 марта 2020

Наконец, я решил это, добавив дополнительную структуру

 import SwiftUI
struct TabViewIssue: View {

    var body: some View {
        TabbarView2()
    }
}


struct TabbarView2: View {
    @State var selectedTab = Tab.game

    enum Tab: Int {
        case game, search, menu,edit
    }

    func tabbarItem(text: String, image: String ,selectedImage: String) -> some View {
        VStack {
            Image(systemName: image)
                .imageScale(.large)
            Text(text)
        }
    }

    var body: some View {
        TabView(selection: $selectedTab) {
            LazyView(TestPage(text:"Page1")).tabItem{
                self.tabbarItem(text: "Edit", image: "person.fill",selectedImage: "person")
            }.tag(Tab.edit)
            LazyView(TestPage2(text:"Page2")).tabItem{
                self.tabbarItem(text: "Game", image: "book.fill",selectedImage: "book")
            }.tag(Tab.game)
        }.edgesIgnoringSafeArea(.top)
    }
}
...