SwiftUI for macOS Monterey基于switch case实现9个菜单随机循环切换问题
SwiftUI 菜单随机跳转实现方案
核心需求适配
- 适配 macOS Monterey 系统,基于最新 Swift 语法实现
- 保留原 switch case 控制菜单视图的逻辑,支持字符串、变量、自定义图形作为菜单标题
- 点击菜单时直接随机跳转至其余8个菜单,无需遍历判断
核心修改说明
仅需要替换原 ListView 中 onTapGesture 块的逻辑即可,原逻辑是按顺序递增轮播,新逻辑生成排除当前索引的可选索引池,直接随机取值赋值:
.onTapGesture { // 生成排除当前选中索引的所有可选菜单索引 let validIndices = (0..<options.count).filter { $0 != currentSelection } // 随机取值跳转,数组非空可安全解包 currentSelection = validIndices.randomElement()! }
完整修改后代码
import Foundation import SwiftUI import CoreData import Combine import PDFKit import SceneKit import WebKit struct Cotharticren: App { var body: some Scene { WindowGroup { ContentView() } } } struct Option: Hashable { let title: String let imageName: String } struct ContentView: View { @State var currentOption = 0 let options: [Option] = [ .init(title: "DART Meadow", imageName: "sun.max.fill"), .init(title: "Research", imageName: "flame"), .init(title: "Navigation", imageName: "moon.stars.fill"), .init(title: "Shelf", imageName: "archivebox"), .init(title: "Chest" ,imageName: "shippingbox"), .init(title: "Crate" ,imageName: "bonjour"), .init(title: "Manufactoring", imageName: "gear"), .init(title: "Warehouse", imageName: "archivebox.fill"), .init(title: "Journal", imageName: "note.text"), ] var body: some View { VStack(alignment: .leading) { HStack(alignment: .top) { ScrollView( .vertical) { NavigationView{ ListView(options: options, currentSelection: $currentOption) switch (currentOption) { case 1: OrbitNodeView() case 2: ATM26NodeView() case 3: NozzleNodeView() case 4: EmptyView() VStack(alignment: .center) { Text("Chest") .font(.largeTitle) .bold() .colorInvert() } case 5: EmptyView() VStack(alignment: .center) { Text("Crate") .font(.largeTitle) .bold() .colorInvert() } case 6: EmptyView() VStack(alignment: .center) { Text("Manufactoring") .font(.largeTitle) .bold() .colorInvert() } case 7: EmptyView() VStack(alignment: .center) { Text("Warehouse") .font(.largeTitle) .bold() .colorInvert() } case 8: VStack(alignment: .center) { Text("Journal") .font(.largeTitle) .bold() .colorInvert() .padding(.top, 60) Image("articrenmeadowopacity") .shadow(radius: 3) WebView() } default: MainView() } }.background(Color.white) } } } Spacer() } } struct MainView: View { var body: some View{ VStack(alignment: .leading) { HStack(alignment: .bottom) { Image("CotharticrenMainView") .shadow(radius: 3) } } .frame(width: 900, height: 800, alignment: .center) Spacer() } } struct ListView: View { let options: [Option] @Binding var currentSelection: Int var body: some View{ VStack(alignment: .leading) { HStack(alignment: .top) { HStack(alignment: .top) { VStack(alignment: .trailing) { Circle() .stroke(Color.init(red: 0.9, green: 0.95, blue: 0.2, opacity: 1), lineWidth: 2) .alignmentGuide(HorizontalAlignment.myAlignment) { d in d[.leading] } .alignmentGuide(VerticalAlignment.myAlignment) { d in d[.bottom] } .frame(width: 50, height: 50) Circle() .stroke(Color.init(red: 0.25, green: 0.9, blue: 0.2, opacity: 1), lineWidth: 2) .alignmentGuide(HorizontalAlignment.myAlignment) { d in d[.leading] } .alignmentGuide(VerticalAlignment.myAlignment) { d in d[.bottom] } .frame(width: 25, height: 25) VStack(alignment: .leading) { Circle() .stroke(Color.init(red: 0.1, green: 0.1, blue: 1, opacity: 1), lineWidth: 2) .alignmentGuide(HorizontalAlignment.myAlignment) { d in d[.leading] } .alignmentGuide(VerticalAlignment.myAlignment) { d in d[.bottom] } .frame(width: 75, height: 75) } } } HStack(alignment: .top) { Image("DARTMeadowCSMwidthArtemis2by1") .shadow(radius: 3) .padding(.top, 10) } .padding(.top, 20) .padding(.trailing, 10) }.padding(.top, 20).padding(.leading, 10) HStack(alignment: .center) { VStack(alignment: .center) { Image("arrow300") HStack(alignment: .center) { Text("You've never plotted an Edge?") } } }.shadow(radius: 3) VStack(alignment: .leading) { let current = options[currentSelection] ForEach(options, id: \.self) {option in HStack { Image(systemName: option.imageName) .frame(width: 20) Text(option.title) .foregroundColor(current == option ? Color.blue : Color.white) } .padding(8) .onTapGesture { let validIndices = (0..<options.count).filter { $0 != currentSelection } currentSelection = validIndices.randomElement()! } } Spacer() }.frame(width: 300, height: 800, alignment: .leading) } Spacer() } } struct WebView: View { var body: some View{ VStack(alignment: .leading) { HStack(alignment: .bottom) { } } .frame(width: 900, height: 800, alignment: .center) Spacer() } }
内容的提问来源于stack exchange,提问作者user16933914
相关产品推荐
相关产品推荐

