简体   繁体   中英

Pass image from tableView to viewController in Swift

I have images in Assets folder and Im trying to pass the data from tableView to next viewController.I have two tables, I created outlet to UIImageView.
ThirdView.swift contains struct
import UIKit

struct ThirdView {
var ThirdViewArray = [String]()
var Pic = [String]()
}

SecondTableViewController.swift contains

class SecondTableViewController: UITableViewController {

var ExerciseListArray = [String]()
var SecondAnswerArray = [String]()



override func viewDidLoad() {
    super.viewDidLoad()
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return ExerciseListArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var Cell = self.tableView.dequeueReusableCell(withIdentifier: "SecondCell", for: indexPath) as UITableViewCell
    Cell.textLabel?.text = ExerciseListArray[indexPath.row]

    return Cell
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    var indexPath: NSIndexPath = self.tableView.indexPathForSelectedRow! as NSIndexPath
    var DestViewController = segue.destination as! ExercisesViewController
    DestViewController.FirstString = SecondAnswerArray[indexPath.row]
    DestViewController.ExerciseImage = SecondAnswerArray[indexPath.row]
}


}

However, SecondAnswerArray is a type of String, I get an error:
"Cannot assign value of typ String to type UIImage" on the line DestViewController.ExerciseImage = SecondAnswerArray[indexPath.row]
Finally, the FirstTableViewController.swift: class FirstTableViewController: UITableViewController {

var BodyPartsArray = [String]()
var SecondArray = [SecondTable]()
var ThirdArray = [ThirdView]()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    BodyPartsArray = ["Neck", "Shoulders", "Upper Arms", "Forearms", "Back", "Chest", "Waist", "Hips", "Thighs", "Calves"]

    SecondArray = [
    SecondTable(SecondTitle: ["Neck1","Neck2","Neck3"]),
    SecondTable(SecondTitle: ["Shoulders1","Shoulders2","Shoulders3"]),
    SecondTable(SecondTitle: ["Upper Arms1","Upper Arms2","Upper Arms3"]),
    SecondTable(SecondTitle: ["Forearms1","Forearms2","Forearms3"]),
    SecondTable(SecondTitle: ["Back1","Back2","Back3"]),
    SecondTable(SecondTitle: ["Chest1","Chest2","Chest3"]),
    SecondTable(SecondTitle: ["Waist1","Waist2","Waist3"]),
    SecondTable(SecondTitle: ["Hips1","Hips2","Hips3"]),
    SecondTable(SecondTitle: ["Thighs1","Thighs2","Thighs3"]),
    SecondTable(SecondTitle: ["Calves1","Calves2","Calves3"])]

    ThirdArray = [
        ThirdView(ThirdViewArray: ["NeckText1","NeckText2","NeckText3"], Pic: []),
        ThirdView(ThirdViewArray: ["ShouldersText1","ShouldersText2","ShouldersText3"], Pic: ["310","311","312"]),
        ThirdView(ThirdViewArray: ["Upper ArmsText1","Upper ArmsText2","Upper ArmsText3"], Pic: ["313","314","315"]),
        ThirdView(ThirdViewArray: ["ForearmsText1","ForearmsText2","ForearmsText3"], Pic: ["","",""]),
        ThirdView(ThirdViewArray: ["BackText1","BackText2","BackText3"], Pic: ["","",""]),
        ThirdView(ThirdViewArray: ["ChestText1","ChestText2","ChestText3"], Pic: ["","",""]),
        ThirdView(ThirdViewArray: ["WaistText1","WaistText2","WaistText3"], Pic: ["","",""]),
        ThirdView(ThirdViewArray: ["HipsText1","HipsText2","HipsText3"], Pic: ["","",""]),
        ThirdView(ThirdViewArray: ["ThighsText1","ThighsText2","ThighsText3"], Pic: ["","",""]),
        ThirdView(ThirdViewArray: ["CalvesText1","CalvesText2","CalvesText3"], Pic: ["","",""])]
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return BodyPartsArray.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let Cell = self.tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as UITableViewCell
    Cell.textLabel?.text = BodyPartsArray[indexPath.row]

    return Cell
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    let indexPath: NSIndexPath = self.tableView.indexPathForSelectedRow! as NSIndexPath
    let DestViewController = segue.destination as! SecondTableViewController
    var SecondTableArrayTwo: SecondTable
    SecondTableArrayTwo = SecondArray[indexPath.row]
    DestViewController.ExerciseListArray = SecondTableArrayTwo.SecondTitle


    var ThirdAnswerArray: ThirdView
    ThirdAnswerArray = ThirdArray[indexPath.row]
    DestViewController.SecondAnswerArray = ThirdAnswerArray.ThirdViewArray
    DestViewController.SecondAnswerArray = ThirdAnswerArray.Pic
}

}

And again, I got the same error on the line DestViewController.SecondAnswerArray = ThirdAnswerArray.Pic

ExercisesViewController:
import UIKit

class ExercisesViewController: UIViewController {

@IBOutlet weak var TextView: UITextView!
@IBOutlet weak var ImageView: UIImageView!

var FirstString = String()
var ExerciseImage = String()

override func viewDidLoad() {

    TextView.text = FirstString
    ImageView.image = ExerciseImage

}
}

Can anyone help me to solve this errors and also show me the proper way to load pictures from Assets to my UIImageView in FirstTableViewController.swift ThirdArray?
Thank you

Cannot assign value of type String to type UIImage" on the line DestViewController.ExerciseImage = SecondAnswerArray[indexPath.row]

Error message is telling you everything. ExerciseImage is type of UIImage and you are assigning String to it.

First create UIImage object than assign it to ExerciseImage

let image = UIImage(named: SecondAnswerArray[indexPath.row])
DestViewController.ExerciseImage = image

Would be nice if you could share the code of ExercisesViewController to have a better advice, but this might help you:

First, the variable DestViewController.ExerciseImage in ExercisesViewController is probably of type UIImage, on your array SecondAnswerArray you contain objects of type String. as declared here:

var SecondAnswerArray = [String]()

When you assign a value from SecondAnswerArray to an object that is expected to be a UIImage you'll get that error saying

Cannot assign value of type String to type UIImage"

Change the type of ExercisesViewController.ExerciseImage to be of type String and that will solve your first problem.

To set an image from the Asset folder you simple assign an image file name to a UIImage like:

let img = UIImage(named: "NAME_OF_YOUR_FILE_WITHOUT_EXTENSION")

then set that image to a UIImageView

imageView.image = img

Hope that helps

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM