将数据从tableView传递到UIViewController swift 3

时间:2017-05-17 17:03:06

标签: ios swift xcode

我试图将每个单元格中的信息传递给UIViewController,就像在这些图像中看到的那样

enter image description here

这是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.
    }


}

这是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)
    }

}

现在我只能通过&#34;名称&#34;但不是其余的,有人可以用一些代码示例来帮助我吗?

3 个答案:

答案 0 :(得分:0)

执行此操作的正确方法是通过准备segue函数传递信息。您可以在FinalClass中定义属性以将引用传递给

在你的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
    } 
}

答案 1 :(得分:0)

prepare(for segue:)中,设置目标视图控制器的localImage属性。

镜像用于填充单元格的代码,它将是:

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

但我同意vadian的评论:从长远来看,我认为你会更乐意使用封装必要数据的Place结构。使用地名作为键对我来说很脆弱。

答案 2 :(得分:0)

    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"))

}

对于地址,您可以从用户当前位置调用Google place API,但我不了解手机和网站。