简体   繁体   中英

Passing data from tableView to UIViewController swift 3

i'm trying to pass the info that are in every single cell to a UIViewController like you see in these images

enter image description here

this is the code of the UITableViewController:

import UIKit
import MapKit
import CoreLocation

class CourseClass: UITableViewController, CLLocationManagerDelegate  {


    @IBOutlet weak var map: MKMapView!

    let manager = CLLocationManager()

    var place = ["Caffè Spagar", "Duks", "Posta station", "Barnum", "Elephant Club", "Cinema", "Space", "Andromeda", "Rodolf", "Devil Chair"]
    var rows = 0





    override func viewDidLoad() {
        super.viewDidLoad()

        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.requestWhenInUseAuthorization()
        manager.startUpdatingLocation()

    }



    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        insertRowsMode3()
    }


    func insertRowsMode2() {

        for i in 0..<place.count {
            insertRowMode2(ind: i, str: place[i])
        }

    }

    func insertRowMode2(ind:Int,str:String) {

        let indPath = IndexPath(row: ind, section: 0)

        rows = ind + 1
        tableView.insertRows(at: [indPath], with: .right)
    }



   func insertRowsMode3() {

        rows = 0

        insertRowMode3(ind: 0)
    }




  func insertRowMode3(ind:Int) {
        let indPath = IndexPath(row: ind, section: 0)
        rows = ind + 1
        tableView.insertRows(at: [indPath], with: .right)


        guard ind < place.count-1 else { return }
        DispatchQueue.main.asyncAfter(deadline: .now()+0.15) {

            self.insertRowMode3(ind: ind+1)
        }
    }



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

        return 1
    }


    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return rows
    }



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

      let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell

        cell.myImage.image = UIImage(named: (place[indexPath.row] + ".png"))
        cell.myLabel.text = place[indexPath.row]

        return (cell)
    }





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

       performSegue(withIdentifier: "goToLast" , sender: place[indexPath.row])

    }


    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100
    }








    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        let location = locations[0]
        let span:MKCoordinateSpan = MKCoordinateSpanMake(0.01, 0.01)

        let myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
        let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span)
        map.setRegion(region, animated: true)

        self.map.showsUserLocation = true


  }





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

        let guest = segue.destination as! FinalClass

        guest.local = sender as! String




    }







    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

and this is the code of the UIViewController:

import UIKit

class FinalClass: UIViewController {


    @IBOutlet weak var lastLabel: UILabel!

    @IBOutlet weak var addressLabel: UILabel!

    @IBOutlet weak var typeLabel: UILabel!

    @IBOutlet weak var lastImage: UIImageView!


    var local = "Zone"
    var localImage = UIImage()

    override func viewDidLoad() {
        super.viewDidLoad()

       lastLabel.text = local
       addressLabel.text = local
       typeLabel.text = local

        lastImage.image = localImage


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func lastBack(_ sender: Any) {

    dismiss(animated: true, completion: nil)
    }

}

for now i can only pass the "name" but not the rest, can someone help me with some example of code?

The proper way to do this is to pass the information via the prepare for segue function. You can define properties in your FinalClass to pass your references to

In your tableviewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToLast" {
       guard let vc = segue.destination as? FinalClass else { return }
       // set properties in your destination VC
       // Example
       // vc.photoProperty = photoFromTheTableViewController
    } 
}

In prepare(for segue:) , set the target view controller's localImage property.

Mirroring the code you use to populate the cell, it would be:

guest.localImage = UIImage(named: (sender as! String) + ".png")

But I agree with vadian's comment: I think you'll be happier, in the long run, with a Place construct that encapsulates the necessary data. Using the place name as a key feels brittle to me.

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

    let guest = segue.destination as! FinalClass

    guest.local = sender as! String
    guest.localImage = UIImage(named: (sender + ".png"))

}

For the address you can call Google place API from the user current location and I don't know about phone and website.

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