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

Swift开发:如何为ViewController的Segues设置if else语句?

如何用if/else控制ViewController的Segue跳转(适配你的类别评分场景)

嘿,作为Swift新手能想到这种动态流程的需求已经很棒了!针对你这个按启用类别逐个跳转评分的场景,我给你两种实用的方案,都是用条件判断来控制Segue的触发,你可以根据自己的需求选:

先做好前置准备:管理你的类别和进度

首先我们需要统一管理类别和当前的评分进度,这样后续的条件判断才有依据:

  1. 定义一个枚举来规范所有可追踪的类别:
enum TrackingCategory: String, CaseIterable {
    case mood = "情绪"
    case social = "社交"
    case sleep = "睡眠"
    // 以后加新类别直接在这里加就行
}
  1. 在你的起始ViewController里,保存用户启用的类别数组和当前处理到的索引:
class EntryStartVC: UIViewController {
    // 这里可以从用户设置里读取实际启用的类别,示例先硬编码
    var enabledCategories: [TrackingCategory] = [.mood, .social, .sleep]
    var currentIndex = 0
    
    // 点击"开始记录"按钮的触发逻辑
    @IBAction func startRecordingTapped(_ sender: UIButton) {
        guard !enabledCategories.isEmpty else {
            // 没有启用的类别,弹提示
            let alert = UIAlertController(title: "提示", message: "请至少启用一个评分类别哦", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "好的", style: .default))
            present(alert, animated: true)
            return
        }
        // 跳转到第一个启用的类别
        performSegue(withIdentifier: "ToCategoryRating", sender: enabledCategories[currentIndex])
    }
}

方案一:通用Segue + 闭包回调(推荐,灵活易扩展)

这种方案只需要一个Segue,通过回调动态判断是否跳转到下一个类别,不用为每个类别单独加Segue,适合类别可能增减的场景:

1. 配置评分ViewController

创建一个通用的CategoryRatingVC,用来处理所有类别的评分:

class CategoryRatingVC: UIViewController {
    // 当前要评分的类别
    var currentCategory: TrackingCategory!
    // 评分完成后的回调,通知上一个VC处理跳转
    var onRatingFinished: (() -> Void)?
    
    // 假设你有评分控件(比如滑块、星级按钮),这里用selectedRating保存用户选择的分数
    var selectedRating: Int = 0

    @IBAction func nextButtonTapped(_ sender: UIBarButtonItem) {
        // 先保存当前评分到你的数据模型(比如Core Data、UserDefaults,这里省略具体逻辑)
        print("已保存\(currentCategory.rawValue)的评分:\(selectedRating)")
        
        // 触发回调,让起始VC判断下一步
        onRatingFinished?()
    }
}

2. 在起始VC里用if/else控制跳转

重写prepare(for:sender:)方法,给评分VC设置回调,在回调里判断是否还有下一个类别:

extension EntryStartVC {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let ratingVC = segue.destination as? CategoryRatingVC {
            // 传递当前要评分的类别
            ratingVC.currentCategory = sender as? TrackingCategory
            
            // 设置评分完成后的回调
            ratingVC.onRatingFinished = { [weak self] in
                guard let self = self else { return }
                
                // 进度+1,判断是否还有下一个类别
                self.currentIndex += 1
                if self.currentIndex < self.enabledCategories.count {
                    // 还有未评分的类别,继续跳转到下一个
                    self.performSegue(withIdentifier: "ToCategoryRating", sender: self.enabledCategories[self.currentIndex])
                } else {
                    // 所有类别都完成了,返回主界面或者显示完成提示
                    let alert = UIAlertController(title: "完成!", message: "今日所有类别评分已记录", preferredStyle: .alert)
                    alert.addAction(UIAlertAction(title: "返回", style: .default) { _ in
                        self.navigationController?.popToRootViewController(animated: true)
                    })
                    self.present(alert, animated: true)
                }
            }
        }
    }
}

方案二:多个Segue + 条件判断(适合类别固定的场景)

如果你的类别不会频繁增减,也可以给每个类别单独创建Segue,然后用switch/if else判断触发哪个:

1. 在Storyboard里创建多个Segue

给起始VC到每个类别对应的评分VC创建Segue,分别设置Identifier:比如ToMoodRating、ToSocialRating、ToSleepRating。

2. 用if/else或switch触发对应Segue

在评分完成的回调里,判断下一个类别,然后触发对应的Segue:

// 还是在EntryStartVC的prepare方法里设置回调
ratingVC.onRatingFinished = { [weak self] in
    guard let self = self else { return }
    self.currentIndex += 1
    
    if self.currentIndex < self.enabledCategories.count {
        let nextCategory = self.enabledCategories[self.currentIndex]
        
        // 用switch/if else判断下一个类别,触发对应Segue
        switch nextCategory {
        case .mood:
            self.performSegue(withIdentifier: "ToMoodRating", sender: nil)
        case .social:
            self.performSegue(withIdentifier: "ToSocialRating", sender: nil)
        case .sleep:
            self.performSegue(withIdentifier: "ToSleepRating", sender: nil)
        }
    } else {
        // 完成所有评分,返回主界面
        self.navigationController?.popToRootViewController(animated: true)
    }
}

新手小贴士

  • 记得在Storyboard里给Segue设置的Identifier要和代码里的完全一致,否则会崩溃。
  • 用[weak self]是为了避免循环引用,防止ViewController无法被释放。
  • 用户的启用类别可以存在UserDefaults里,这样重启APP后设置不会丢失。
  • 如果需要给每个类别评分VC做差异化UI,方案二会更方便定制。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:28:11