Ios 在另一个类中使用用户选择的结构

Ios 在另一个类中使用用户选择的结构,ios,swift,Ios,Swift,我有一个包含结构的文件,每个结构包含一个数组 我希望能够使用用户在另一个视图中选择的结构!对不起,我不能解释我自己 代码如下: 这是一个包含训练的 import Foundation struct Routines { let routineName: String let videoFileName: String let description: Array<Any> let thumbnailFileName: String static func fetchRoutine

我有一个包含结构的文件,每个结构包含一个数组

我希望能够使用用户在另一个视图中选择的结构!对不起,我不能解释我自己

代码如下:

这是一个包含训练的

import Foundation

struct Routines {
let routineName: String
let videoFileName: String
let description: Array<Any>
let thumbnailFileName: String

static func fetchRoutines() -> [Routines] {
    let v1 = Routines(routineName: "Recommended Routine", videoFileName: "v1", description: Workout1.fetchWorkout1(), thumbnailFileName: "v8")
    let v2 = Routines(routineName: "Routine Extra", videoFileName: "v2", description: Workout2.fetchWorkout2(), thumbnailFileName: "v2")

    return [v1, v2]
}
}

struct Workout1 {

let excerciseName: String
let sets: Int
let reps: Int

static func fetchWorkout1() -> [Workout1] {

    let w1 = Workout1(excerciseName: "Bench Press", sets: 3, reps: 8)
    let w2 = Workout1(excerciseName: "Push Press", sets: 3, reps: 8)
    let w3 = Workout1(excerciseName: "Squat", sets: 3, reps: 8)
    let w4 = Workout1(excerciseName: "Deadlift", sets: 3, reps: 8)
    let w5 = Workout1(excerciseName: "Bicep Curl", sets: 3, reps: 8)
    let w6 = Workout1(excerciseName: "Tricep Pushdown", sets: 3, reps: 8)



    return [w1,w2,w3,w4,w5,w6]
}


}

struct Workout2 {

let excerciseName: String
let sets: Int
let reps: Int

static func fetchWorkout2() -> [Workout2] {

    let e1 = Workout2(excerciseName: "Bench Press", sets: 5, reps: 15)
    let e2 = Workout2(excerciseName: "Push Press", sets: 3, reps: 3)
    let e3 = Workout2(excerciseName: "Squat", sets: 5, reps: 5)
    let e4 = Workout2(excerciseName: "Deadlift", sets: 3, reps: 3)
    let e5 = Workout2(excerciseName: "Bicep Curl", sets: 5, reps: 15)
    let e6 = Workout2(excerciseName: "Tricep Pushdown", sets: 5, reps: 15)



    return [e1,e2,e3,e4,e5,e6]
}

}
在这里,我希望能够使用该阵列并显示信息

import Foundation
import UIKit


class WorkoutViewController: UITableViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = #colorLiteral(red: 0.8352941176, green: 0.8352941176, blue: 0.8352941176, alpha: 1)
}


var workouts: [Workout1] = Workout1.fetchWorkout1()
//var workoutSelected = WorkoutsListViewController.workoutSelected



override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return workouts.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "workoutCell", for: indexPath)
    let workout = workouts[indexPath.row]
    cell.textLabel?.text = workout.excerciseName
    cell.textLabel?.textColor = UIColor.black

    return cell


}



override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let workout = workouts[indexPath.row]
    tableView.deselectRow(at: indexPath, animated: true)
    print("Do \(workout.sets) sets of \(workout.reps) reps of \(workout.excerciseName)")
}

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cell.backgroundColor = UIColor.clear
}

}
在didSelectRowAt中,将索引路径作为performSegue的发送方参数传递,不传递其他内容

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    performSegue(withIdentifier: "segueToWorkout", sender: indexPath)
}
然后覆盖segue的preparefor,将训练数组传递给目标控制器

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segueToWorkout" {
        let destinationController = segue.destination as! WorkoutViewController
        let indexPath = sender as! IndexPath
        let routine = routines[indexPath.row]
        destinationController.workouts = routine.description
    }
}
顺便说一下,您的结构非常混乱。为什么两个训练数组不使用一个结构,这样可以避免任何声明

struct Workout {

    let excerciseName: String
    let sets: Int
    let reps: Int

    static func fetchWorkout1() -> [Workout] {
        return [Workout(excerciseName: "Bench Press", sets: 3, reps: 8),
                Workout(excerciseName: "Push Press", sets: 3, reps: 8),
                Workout(excerciseName: "Squat", sets: 3, reps: 8),
                Workout(excerciseName: "Deadlift", sets: 3, reps: 8),
                Workout(excerciseName: "Bicep Curl", sets: 3, reps: 8),
                Workout(excerciseName: "Tricep Pushdown", sets: 3, reps: 8)]
    }

    static func fetchWorkout2() -> [Workout] {
        return [Workout(excerciseName: "Bench Press", sets: 5, reps: 15),
                Workout(excerciseName: "Push Press", sets: 3, reps: 3),
                Workout(excerciseName: "Squat", sets: 5, reps: 5),
                Workout(excerciseName: "Deadlift", sets: 3, reps: 3),
                Workout(excerciseName: "Bicep Curl", sets: 5, reps: 15),
                Workout(excerciseName: "Tricep Pushdown", sets: 5, reps: 15)]
    }
}
然后在例程中声明

和在WorkoutViewController中


您必须在某个点重新加载表格视图,例如,在view中,将出现表格视图,但决不能使用didSet observer。

已解决!多亏了@vadrian

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segueToWorkout" {
        let destinationController = segue.destination as! UINavigationController
        let indexPath = sender as! IndexPath
        let routine = routines[indexPath.row]
        let dvc = destinationController.topViewController as! WorkoutViewController
        svc.workouts = routine.description
    }
}

不走运。我认为存在问题:重写func tableView_utableview:UITableView,didSelectRowAt indexPath:indexPath{let routine=routines[indexPath.row]PrintRoutineName workoutSelected=routine.description printworkoutSelected/*WorkoutsListViewController.workoutSelected=routine.description printWorkoutsListViewController.workoutSelected*/tableView.Decelrowat:indexPath,动画:true PerformsgueWithIdentifier:SegueTowork,发件人:self}例行公事。说明没有得到[]。运气不好意味着什么?请使用我建议的代码。不需要在didSelectRowAt中获取例程。应用程序崩溃。无法将“UINavigationController”0x1162c9a20类型的值强制转换为“BodyweightFitness.WorkoutViewController”0x109b96348。2019-02-13 20:23:41.091293+0100 BodyweightFitness[30764:20025883]无法将类型为“UINavigationController”0x1162c9a20的值强制转换为“BodyweightFitness.WorkoutViewController”0x109b96348。已解决。重写segue:UIStoryboardSegue的函数准备,发送方:有吗?{如果segue.identifier==seguetoworkut{let destinationController=segue.destinationas!UINavigationController let indexath=sender as!indexPath let routine=routines[indexath.row]将dvc=destinationController.topViewController设为!WorkoutViewController svc.workouts=routine.description}
let description: [Workout]
var workouts = [Workout]()
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segueToWorkout" {
        let destinationController = segue.destination as! UINavigationController
        let indexPath = sender as! IndexPath
        let routine = routines[indexPath.row]
        let dvc = destinationController.topViewController as! WorkoutViewController
        svc.workouts = routine.description
    }
}