2017-05-17 25 views
0

Ich versuche, die Informationen weitergeben, die zu einem UIViewController in jeder einzelnen Zelle sind wie Sie in diesen BildernPassing Daten von Tableview Uiviewcontroller swift 3

enter image description here

Dies ist der Code des UITableViewController sehen :

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


} 

und das ist der Code des UIViewController ist:

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

} 

für jetzt kann ich nur den "Namen" aber nicht den Rest weitergeben, kann mir jemand mit einem Beispielcode helfen?

+1

Sie haben nur den Namen in der Datenquelle. Um mehr Parameter zu haben, benötigen Sie eine benutzerdefinierte Struktur oder Klasse als Modell. – vadian

+0

danke @vadian – bero

Antwort

0

Der richtige Weg, dies zu tun, besteht darin, die Informationen über die Funktion prepared for segue weiterzuleiten. Sie können Eigenschaften in Ihrer FinalClass definieren Sie Ihre Verweise auf

In Ihrem Tableviewcontroller der Zielansicht des Controllers localImage

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 
    } 
} 
+0

Das Plakat hat bereits 'prepare (for segue:)' im Code. –

+0

Poster verwendet Force Downcasts. –

+0

... was eine schlechte Praxis ist. Aber es ist auch nicht die Frage, die das Plakat stellt. –

0

In prepare(for segue:) gesetzt Eigentum zu übergeben.

Mirroring den Code, den Sie in die Zelle zu füllen verwenden, wäre es:

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

Aber ich stimme Kommentar mit Vadian ist: Ich glaube, du glücklicher sein werde, auf lange Sicht, mit einem Platz Konstrukt, das kapselt die notwendigen Daten ein. Die Verwendung des Ortsnamens als Schlüssel fühlt sich für mich spröde an.

+0

es funktioniert dank @Joshua Kaden – bero

+0

Ausgezeichnet! Froh das zu hören. –

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

} 

Für die Adresse können Sie Google Ort API von dem Benutzer aktuellen Standort anrufen und ich weiß nicht, über Telefon und Website.

+0

Sie sollten nicht als verwenden! Im Herrenhaus benutzt du es hier. Das ist ein Kraftabfall und hat das Potenzial, schwierige Bugs zu verursachen. –

Verwandte Themen