i'm trying to pass the info that are in every single cell to a UIViewController like you see in these images
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.