Swift开发:如何为ViewController的Segues设置if else语句?
如何用if/else控制ViewController的Segue跳转(适配你的类别评分场景)
嘿,作为Swift新手能想到这种动态流程的需求已经很棒了!针对你这个按启用类别逐个跳转评分的场景,我给你两种实用的方案,都是用条件判断来控制Segue的触发,你可以根据自己的需求选:
先做好前置准备:管理你的类别和进度
首先我们需要统一管理类别和当前的评分进度,这样后续的条件判断才有依据:
- 定义一个枚举来规范所有可追踪的类别:
enum TrackingCategory: String, CaseIterable { case mood = "情绪" case social = "社交" case sleep = "睡眠" // 以后加新类别直接在这里加就行 }
- 在你的起始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
相关产品推荐
相关产品推荐

