从另一个视图关闭视图



我还在学习SwiftUI,遇到了一个小问题。

在我的应用程序中,我有一个主视图。顶部是一个搜索栏,底部是一个带有不同按钮的菜单。我想在单击这些按钮时更改视图。但是,我只想更改中间部分。

没什么大不了的,我只是把中间部分放在NavigationView中。这很好,我可以改变我的观点。我的问题是下面的按钮对新视图没有任何影响。

尽量简化:假设我在主页上。然后我点击杂货清单按钮(猜猜我在做什么学校项目哈哈(。我的导航链接工作得很好,可以进入列表。所以,现在我在视图2中。当我按下主页按钮时,它不会关闭该视图并转到我的主视图。这是我的代码设置:

import SwiftUI
struct ContentView: View {
@State private var searchText: String = ""
@State private var action: Int? = 0

var body: some View {

ZStack {

// Top Menu

VStack{
HStack {
Spacer()
TextField("Search",
text: $searchText)
.background(Color.white)

Button(action: {
self.action = 1
}, label: {
Image(systemName: "magnifyingglass.circle")
.font(.largeTitle)
})
Spacer()
}

// Body

NavigationView {
VStack {
Text("Can I See Something")
NavigationLink(destination: SearchView(), tag: 1, selection: $action) {
}
Text("Yes/No")
}
}

Spacer()

// Bottom Menu

HStack (alignment: .top) {
Spacer()
VStack {
Button(action: {

}, label: {
Image(systemName: "house.fill")
.font(.largeTitle)
})
.padding(.top)
Text("Home")
}
Divider()
.padding(.horizontal)
.frame(width: 2.5, height: 100)
VStack {
Button(action: {

}, label: {
Image(systemName: "newspaper")
.font(.largeTitle)
})
.padding(.top)
Text("WeeklynAd")
.multilineTextAlignment(.center)
}
Divider()
.padding(.horizontal)
.frame(width: 2.5, height: 100)
VStack {
Button(action: {

}, label: {
Image(systemName: "checklist")
.font(.largeTitle)
})
.padding(.top)
Text("GrocerynList")
.multilineTextAlignment(.center)
}
Divider()
.padding(.horizontal)
.frame(width: 2.5, height: 100)
VStack {
Button(action: {

}, label: {
Image(systemName: "person.crop.circle")
.font(.largeTitle)
})
.padding(.top)
Text("Account")
}
Spacer()
}
}
}
}
}
struct SearchView: View {
var body: some View {
ZStack {
Text("Nothing to see here!")
}
.navigationBarBackButtonHidden(true)
}

}

SearchView是应用程序中的一个单独视图(在其自己的文件中(,当按下放大镜按钮时会打开。目前它什么都不做。然而,我希望能够在上面的视图中按下这些按钮,仍然可以导航应用程序。

另外,从另一个方面来说,有没有办法去掉后退按钮?

在您的代码中,按钮没有任何功能。与其自己创建一个选项卡栏,我更愿意使用以下内容:

import SwiftUI
struct ContentView: View {
var body: some View {
TabView {
MainView()
.tabItem {
Label("Home", systemImage: "house.fill")
}
NewsView()
.tabItem {
Label("WeeklynAd", systemImage: "newspaper")
}

OrderView()
.tabItem {
Label("GrocerynList", systemImage: "checklist")
}

AccountView()
.tabItem {
Label("Account", systemImage: "person.crop.circle")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct MainView: View {
var body: some View {
Text("Home View")
}
}
struct NewsView: View {
var body: some View {
Text("News View")
}
}
struct OrderView: View {
var body: some View {
Text("Order View")
}
}
struct AccountView: View {
var body: some View {
Text("Account View")
}
}

在这种情况下,您必须为正在配置的每个选项卡创建一个视图(请参阅最后4个结构(。

如果你想用一个有自己创建的按钮的Stack来做这件事,我认为你也应该创建al4视图,然后你要么隐藏它们,要么用偏移量把它们放在焦点之外。在这种情况下,按钮应隐藏/显示特定视图,或相应地更改偏移,以将特定视图移动到可见区域。通过偏移,还可以添加一些动画。

关于应用程序顶部的搜索栏,由于视图都不同,我不会在任何地方都保留相同的搜索栏。但如果你真的想这样做,你可以将代码+搜索栏嵌入到VStack中(就像你在示例中所做的那样(。