ios - 根据按下的按钮,通过 Segue 传递变量返回的对象

标签 ios swift segue swift4 uistoryboardsegue

我有一个 WorkoutGenerator 结构,它根据不同的参数返回不同的锻炼,例如 generateWorkout.standardWorkout 返回不同于 generateWorkout.hardWorkout 的内容.

我在“锻炼设置”页面上有 3 个按钮,每个按钮用于将不同类型的锻炼传递到“锻炼页面”(还有一个“锻炼时间”输入字段)。

我目前有一个 segue goToWorkout 从“锻炼设置页面”到“锻炼页面”

我想做的是触发 segue 到锻炼页面,根据用户按下的按钮传递不同的锻炼。

到目前为止我有:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    //currently have one segue between the pages
    if segue.identifier == "goToWorkout" {

        let finalTimeForWorkout = Int(timeInputField.text!)              
        //set a standardWorkout to pass to Workout Page
        let finalWorkout = FinalWorkout(generatedWorkout: WorkoutGenerator.standardWorkout.generate(), timeForWorkout: finalTimeForWorkout!)

        //set the final parameters ready to pass
        let finalWorkoutTime = finalWorkout.timeForWorkout
        let finalWorkoutExercises = finalWorkout.generatedWorkout.workoutExercises

        if let destVC = segue.destination as? WorkoutController {
            destVC.selectedWorkoutExerciseArray = finalWorkoutExercises
            destVC.selectedWorkoutTime = finalWorkoutTime

        }
    }
}  

and then something like this for each button :

//use this button to pass a standard workout
//want to pass a diff workout if a diff button pressed
@IBAction func standardWorkoutPressed(_ sender: UIButton) {
    performSegue(withIdentifier: "goToWorkout", sender: self )
}

我玩了几个小时后遇到的问题是如何优雅地将不同的锻炼传递到锻炼页面。

即我想我可以从字面上复制并粘贴每个按钮的所有代码并为每个按钮创建一个新的 segue,但这似乎是错误的方法!

我尝试过的事情是将训练定义为 if else if 部分中的变量,但最终训练超出了 segue 的范围。

希望这是有道理的,我能找到的关于条件转场的答案似乎主要是指“只允许转场在这种情况下发生”,而不是将不同的数据集传递到同一目的地。例如example1example2

最佳答案

我会将我的评论添加为答案,以便更轻松地展示一些代码示例。

向您的 View Controller 添加一个属性:

var selectedWorkout : FinalWorkout!

在三个按钮操作方法中的每一个中,您都将此属性设置为与每个按钮关联的锻炼。所以对于你的标准锻炼:

@IBAction func standardWorkoutPressed(_ sender: UIButton) {
    let finalTimeForWorkout = Int(timeInputField.text!)

    self.selectedWorkout = FinalWorkout(generatedWorkout: WorkoutGenerator.standardWorkout.generate(), timeForWorkout: finalTimeForWorkout!)
    performSegue(withIdentifier: "goToWorkout", sender: self )
}

最后:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToWorkout" {
        let finalWorkoutTime = selectedWorkout.timeForWorkout
        let finalWorkoutExercises = selectedWorkout.generatedWorkout.workoutExercises
        if let destVC = segue.destination as? WorkoutController {
            destVC.selectedWorkoutExerciseArray = finalWorkoutExercises
            destVC.selectedWorkoutTime = finalWorkoutTime
        }
    }
 }

关于ios - 根据按下的按钮,通过 Segue 传递变量返回的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50407419/

相关文章:

ios - 执行 segue 后 ViewDidLoad 再次调用

swift - 在 Swift 中,如何使动态 tableView 单元格可选择,以便当按下它时它会传输到不同的 tableViewController?

ios - 是否可以从界面生成器设置 UIView 边框属性?

ios - 应用程序组中的 NSUserDefaults 不起作用

ios - Swift 4 捕获照片,photoOutput 返回 nil

swift - 使用 CATransition 自定义 Segue

ios - 使用 WillSet 属性观察器更改值

ios - automaticallyAdjustsScrollViewInsets 不工作

arrays - 有没有办法获取对象中属性值的数组?

ios - 完成社交分享后开始Segue