以下の例では3rd View
、TabView からに移動し、Button to present シートをクリックすると、シートは表示されますが3rd View
、ポップされます。TabView 本体が再呼び出しされる理由がわかりません。私は次のことを試しました:
- 別の State プロパティを用意して、Navigation Link にバインドします。
- StateObject を作成し、その中にプロパティを配置して、ナビゲーション リンクにバインドします。
- isActive パラメータを使用せずにナビゲーション リンクを直接設定します。
struct TestView: View {
@State var selectedTab: TabType = .home
var body: some View {
NavigationView {
TabView(selection: $selectedTab) {
ForEach(TabType.allCases, id: \.self) { tabType in
switch tabType {
case .profile:
ThirdView()
.navigationBarHidden(selectedTab == .profile)
.tag(tabType)
.tabItem {
Label(tabType.title, systemImage: "plus")
}
default:
SecondView()
.tag(tabType)
.tabItem {
Label(tabType.title, systemImage: "star")
}
}
}
}
}
}}
struct SecondView: View {
var body: some View {
VStack {
Spacer()
Text("2nd view")
NavigationLink("3rd view", destination: ThirdView())
Spacer()
}
.background(Color.green)
}
}
struct ThirdView: View {
@State var presentSheet = false
var body: some View {
ZStack {
Color.gray
VStack {
Text("3rd view")
Spacer()
Button("Button") {
presentSheet = true
}
.padding()
}
}
.sheet(isPresented: $presentSheet) {
VStack {
Spacer()
Text("This is sheet")
Spacer()
}
}
}
}
enum TabType: CaseIterable {
case home
case discover
case profile
case more
var image: Image {
switch self {
case .home:
return Image(systemName: "plus")
case .discover:
return Image(systemName: "plus")
case .profile:
return Image(systemName: "plus")
case .more:
return Image(systemName: "plus")
}
}
var title: LocalizedStringKey {
switch self {
case .home:
return LocalizedStringKey("home")
case .discover:
return LocalizedStringKey("Discover")
case .profile:
return LocalizedStringKey("Me")
case .more:
return LocalizedStringKey("Shop")
}
}
}