根据按下的按钮,通过Segue传递变量返回Object

时间:2018-05-18 08:53:43

标签: ios swift segue swift4 uistoryboardsegue

我有一个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'而不是将不同的数据集传递到同一目的地。例如example1example2

3 个答案:

答案 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} 

我可能已经错过了你的问题,如果这是案例评论,我会更新答案。