You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:09:04