Строки UITableView не отображаются с mapkit в swift4

#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 after try 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()
}