#ios #swift #uitableview #mapkit
#iOS #swift #uitableview #mapkit
Вопрос:
Я пытаюсь использовать mapkit и uitable в viewcontroller. У меня есть mapkit, работающий с раздражениями, но я хотел бы показать имена в uitable под mapkit.
Происходит то, что ‘TableView (_ TableView: UITableView, cellForRowAt indexPath:’ даже не замечается. Я попытался добавить ‘self.TableView.reloadData ()’, но все равно нет.
Может ли кто-нибудь сообщить мне, где я ошибаюсь?
import Foundation
import UIKit
import CoreLocation
import MapKit
class customPin: NSObject, MKAnnotation {
var coordinate: CLLocationCoordinate2D
var title: String?
var subtitle: String?
init(pinTitle:String, pinSubTitle:String, location:CLLocationCoordinate2D) {
self.title = pinTitle
self.subtitle = pinSubTitle
self.coordinate = location
}
}
class MainViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var mapview: MKMapView!
var tableView: UITableView = UITableView()
var pipCan = [Int: pipiCanDBList]()
let cellReuseIdentifier = "pipCans"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
pipiCanList()
locationMap()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.frame = CGRect(x: 0, y: 450, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
tableView.delegate = self
tableView.dataSource = self
self.view.addSubview(tableView)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return pipCan.count
}
//HERE IS THE PROBLEM
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
print("test 123")
// configure cell
// let point = pipCan[indexPath.row].
cell.textLabel?.text = pipCan[indexPath.row]?.ParkName
// cell.detailTextLabel?.text = "((point.coordinate.latitude), (point.coordinate.longitude))"
return cell
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "Section (section )"
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
//get the json information
func pipiCanList(){
let url = "http://blueXXXX.lk/Apps/pipiCan/Api/xxxx.php";
let urlObj = URL(string:url);
URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
do{
let pipiCans = try JSONDecoder().decode([pipiCanDBList].self, from: data!)
for pipiCan in pipiCans{
let Latitude = (pipiCan.ParkLatitude! as NSString).doubleValue
let Longitude = (pipiCan.ParkLongitude! as NSString).doubleValue
let location = CLLocationCoordinate2D(latitude: Latitude, longitude: Longitude)
DispatchQueue.main.async {
let pin = customPin(pinTitle: pipiCan.ParkName!, pinSubTitle: pipiCan.Area!, location: location)
self.mapview.addAnnotation(pin)
}
}
} catch{
print ("Error - cannot get list")
}
}.resume()
}
func locationMap(){
let latitude1 = 41.3825
let longitude1 = 2.17694
let location = CLLocationCoordinate2D(latitude: latitude1 , longitude:longitude1 )
let region = MKCoordinateRegion(center: location, span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05))
self.mapview.setRegion(region, animated: true)
self.mapview.delegate = self
}
}
Комментарии:
1. Где ваш
pipCan
мутированный? Я имею в виду, где вы это изменяете?2. Привет, найем, у меня есть следующее на другой странице struct pipiCanDBList: Codable { пусть ParkName: String? пусть область: строка? пусть ParkLongitude: Строка? пусть parklatity: Строка? }
3. Я не спрашивал вас о структуре вашего объекта модели. Смотрите, вы вернулись
pipCan.count
из метода источника данных табличного представления. Но вы только инициализировалиpipCan
пустой объект и никогда не добавляли к нему дополнительные объекты. ПоэтомуpipCan.count
всегда возвращается 0 . Вот почему в вашем табличном представлении нет строки для отображения.4. Спасибо, Найем. Пожалуйста, не могли бы вы рассказать мне, как я могу инициализировать pipCan, который обычно включает пустой объект?
5. Установите
pipiCans
значениеself. pipiCan
aftertry JSONDecoder()~~~
и ‘self.TableView.reloadData()’
Ответ №1:
Вам не хватает пары вещей в pipiCanList
self.pipCan = pipiCans
self.tableView.reloadData()
Итак, ваш метод будет выглядеть так
func pipiCanList() {
let url = "http://blueXXXX.lk/Apps/pipiCan/Api/xxxx.php";
let urlObj = URL(string:url);
URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
do {
let pipiCans = try JSONDecoder().decode([pipiCanDBList].self, from: data!)
for pipiCan in pipiCans{
let Latitude = (pipiCan.ParkLatitude! as NSString).doubleValue
let Longitude = (pipiCan.ParkLongitude! as NSString).doubleValue
let location = CLLocationCoordinate2D(latitude: Latitude, longitude: Longitude)
DispatchQueue.main.async {
let pin = customPin(pinTitle: pipiCan.ParkName!, pinSubTitle: pipiCan.Area!, location: location)
self.mapview.addAnnotation(pin)
}
}
self.pipCan = pipiCans
self.tableView.reloadData()
} catch {
print ("Error - cannot get list")
}
}.resume()
}