gpt4 book ai didi

ios - 在 SwiftUI 中显示来自 NavigationBarItem 菜单的不同 View

转载 作者:行者123 更新时间:2023-12-04 03:49:54 25 4
gpt4 key购买 nike

我试图根据在 NavigationBar 菜单中选择的选项显示不同的 View 。我陷入了执行此操作的最佳方法。首先,根据我目前的做法(我认为这是不对的!),当我按下菜单项时,我在 Xcode 调试器中收到一条消息:

SideMenu[16587:1131441] [UILog] Called -[UIContextMenuInteractionupdateVisibleMenuWithBlock:] while no context menu is visible. Thiswon't do anything.

我该如何解决这个问题?

其次,当我从菜单中选择一个选项时,如何重置 bool 以便它不会被执行,除非再次从菜单中选择它。尝试在 if 条件下重置为 self.showNewView = false 会导致编译器错误

这是我尝试使用的完整可执行示例代码。感谢解决此问题的任何帮助。谢谢!

struct ContentView: View {
@State var showNewView = false
@State var showAddView = false
@State var showEditView = false
@State var showDeleteView = false

var body: some View {
NavigationView {
GeometryReader { g in
VStack {
if self.showAddView {
AddView()
}
if self.showNewView {
NewView()
}
if self.showEditView {
EditView()
}
if self.showDeleteView {
DeleteView()
}
}.frame(width: g.size.width, height: g.size.height)
}
.navigationTitle("Title")
.navigationBarItems(leading: {
Menu {
Button(action: {showNewView.toggle()}) {
Label("New", systemImage: "pencil")
}
Button(action: {showEditView.toggle()}) {
Label("Edit", systemImage: "square.and.pencil")
}
} label: {
Image(systemName: "ellipsis.circle")
}
}(), trailing: {
Menu {
Button(action: {showAddView.toggle()}) {
Label("Add", systemImage: "plus")
}
Button(action: {showDeleteView.toggle()}) {
Label("Delete", systemImage: "trash")
}
} label: {
Image(systemName: "plus")
}
}())
}
.navigationBarTitleDisplayMode(.inline)
.navigationViewStyle(StackNavigationViewStyle())
}
}



struct NewView: View {
var body: some View {
GeometryReader { g in
Text("This is New View")
}
.background(Color.red)
}
}

struct EditView: View {
var body: some View {
GeometryReader { g in
Text("This is Edit View")
}
.background(Color.green)
}
}

struct AddView: View {
var body: some View {
GeometryReader { g in
Text("This is Add View")
}
.background(Color.orange)
}
}

struct DeleteView: View {
var body: some View {
GeometryReader { g in
Text("This is Delete View")
}
.background(Color.purple)
}
}

这是我选择每个菜单项时得到的结果。我希望能够只显示一个菜单项。当一个新的菜单项被选中时,基本上忽略另一个

enter image description here

enter image description here

最佳答案

一种可能的解决方案是为您的当前 View 使用专用枚举(而不是四个@State 属性):

enum CurrentView {
case new, add, edit, delete
}
@State var currentView: CurrentView?

请注意,您还可以将部分代码提取到计算属性。


完整代码如下:

enum CurrentView {
case new, add, edit, delete
}

struct ContentView: View {
@State var currentView: CurrentView?

var body: some View {
NavigationView {
GeometryReader { g in
content
.frame(width: g.size.width, height: g.size.height)
}
.navigationTitle("Title")
.navigationBarTitleDisplayMode(.inline)
.navigationBarItems(leading: leadingBarItems, trailing: trailingBarItems)
}
.navigationViewStyle(StackNavigationViewStyle())
}

@ViewBuilder
var content: some View {
if let currentView = currentView {
switch currentView {
case .add:
AddView()
case .new:
NewView()
case .edit:
EditView()
case .delete:
DeleteView()
}
}
}

var leadingBarItems: some View {
Menu {
Button(action: { currentView = .new }) {
Label("New", systemImage: "pencil")
}
Button(action: { currentView = .edit }) {
Label("Edit", systemImage: "square.and.pencil")
}
} label: {
Image(systemName: "ellipsis.circle")
}
}


var trailingBarItems: some View {
Menu {
Button(action: { currentView = .add }) {
Label("Add", systemImage: "plus")
}
Button(action: { currentView = .delete }) {
Label("Delete", systemImage: "trash")
}
} label: {
Image(systemName: "plus")
}
}
}

关于ios - 在 SwiftUI 中显示来自 NavigationBarItem 菜单的不同 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64566589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com