Я был зол на 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 будет вызываться дважды .. Она устала