Передайте переменную, возвращенную Object через Segue, в зависимости от того, какая кнопка нажата - PullRequest
0 голосов
/ 18 мая 2018

У меня есть структура WorkoutGenerator, которая возвращает разные тренировки на основе разных параметров, например, generateWorkout.standardWorkout возвращает что-то отличное от generateWorkout.hardWorkout.

У меня есть 3 кнопки на странице «Настройка тренировки»,каждый из них предназначался для передачи различного типа тренировки на «страницу тренировки» (также есть поле ввода для «времени тренировки»).

В настоящее время у меня есть один переход 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 )
}

Моя проблема после нескольких часов игры с ней состоит в том, как элегантно передать другую тренировку на страницу тренировки.

то есть, я думаю, я мог бы буквально просто скопировать и вставить весь код для каждой кнопки и создать новый переход для каждой, но это кажется неправильным способом сделать это!

Подобные вещиЯ пытался определить тренировки как переменные в разделе if else if, но тогда окончательные тренировки не будут рассмотрены.

Надеюсь, что это имеет смысл, ответы, которые я могу найти об условных переходах, в основном относятся к «разрешению перехода только при этом условии», а не к передаче разных наборов данных в один и тот же пункт назначения.например, example1 и example2

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

В 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!)
0 голосов
/ 18 мая 2018

Если у меня есть это право, вы хотите передать другой аргумент в вашу функцию 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} 

Возможно, я пропустил то, что вы спрашивали, если это комментарий к делу, и я обновлю ответ.

0 голосов
/ 18 мая 2018

Вместо этого я добавлю свой комментарий в качестве ответа, чтобы упростить показ некоторых примеров кода.

Добавьте свойство в свой 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
        }
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...