我有一个WorkoutGenerator
结构,它根据不同的参数返回不同的训练,例如generateWorkout.standardWorkout
会返回与generateWorkout.hardWorkout
不同的内容。
我在锻炼设置中有3个按钮'页面,每个都意味着将不同类型的锻炼传递给锻炼页面' (还有一个输入字段用于'锻炼时间')。
我目前有一个来自"锻炼设置页面的#{1}}"到"锻炼页面"
我想要做的是触发goToWorkout
到锻炼页面,根据用户按下的内容传递不同的锻炼。
到目前为止,我有:
segue
在玩了几个小时之后我的问题是如何优雅将不同的锻炼传递到锻炼页面。
即。我想我可以简单地复制并粘贴每个按钮的所有代码,并为每个按钮创建一个新的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 )
}
if
部分中的变量,但最后的训练超出了segue的范围。
希望这是有道理的,我能找到的关于条件segues的答案似乎主要指的是只允许在这种条件下发生segue'而不是将不同的数据集传递到同一目的地。例如example1和example2
答案 0 :(得分:1)
我会将我的评论添加为答案,以便更容易地展示一些代码示例。
向viewcontroller添加属性:
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
}
}
}
答案 1 :(得分:1)
在performSegue(withIdentifier:sender:)
中,sender
可以是您喜欢的任何内容。
使用sender
将生成的锻炼传递给performSegue
:
//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: WorkoutGenerator.standardWorkout.generate() )
}
然后在prepare(for:sender:)
let finalWorkout = FinalWorkout(generatedWorkout: sender as! YourWorkoutGeneratorType, timeForWorkout: finalTimeForWorkout!)
答案 2 :(得分:0)
如果我有这个权利,你想根据按下哪个按钮将不同的参数传递到FinalWorkout()
函数中?
它并不总是使代码非常易读,但您可以使用UIButton tag
属性。如果将每个按钮的标签属性设置为唯一值[0,1,2],则可以使用该信息生成不同的锻炼:
// This code would be in: override func prepare(for segue: UIStoryboardSegue, sender: Any?)
let buttonTag = (sender as! UIButton).tag
if buttonTag == 0 { // Generate type of workout}
else if buttonTag == 1 { // Generate type of workout }
else if buttonTag == 2 { // Generate type of workout }
或者,如果您担心标签不是直观的表示,您可以使用每个按钮的IBOutlet参考来测试相等性:
let buttonPressed = sender as! UIButton
if (buttonPressed == self.yourButtonIBOutletPropertyName) { // select a workout for this button}
我可能已经错过了你的问题,如果这是案例评论,我会更新答案。