Я разрабатываю навигационное приложение для iOS, которое использует Location Services, но у меня возникла проблема с ним.У меня есть объект UITableViewController
, который создает экземпляр LocationManager
, настраивает его для желаемой точности, фильтра расстояния и т. Д. У меня есть делегаты для didUpdateLocations
и didChangeAuthorization
, но по какой-то причине он падает при следующих условиях.Службы определения местоположения отключены, я запускаю приложение и получаю предупреждение о включении служб определения местоположения, которое я делаю, а затем возвращаюсь к приложению, ожидая, что оно отобразит другое предупреждение о запросе доступа к местоположению пользователя, но оно никогда не появляется.Приложение вылетает, когда я выбираю строку в своей таблице, потому что текущее местоположение пользователя не было инициализировано в моем UITableViewController
.didUpdateLocations
не вызывается.
// CountiesTableVC.swift
// TableViewsApp
//
// Created by Stephen Learmonth on 10/12/2018.
// Copyright © 2018 Stephen Learmonth. All rights reserved.
//
import UIKit
import CoreLocation
import MapKit
class CountiesTableVC: UITableViewController {
let england : England = England()
var countiesArray : [String] = ["Northamptonshire",
"Bedfordshire",
"Hertfordshire",
"Staffordshire",
"Essex",
"North Yorkshire",
"Herefordshire",
"Cornwall",
"Dorset",
"Derbyshire",
"Leicestershire",
"Lancashire",
"Cheshire",
"Merseyside",
"Suffolk",
"County Durham",
"Cumbria",
"Gloucestershire",
"Wiltshire",
"Nottinghamshire",
"Devon",
"Somerset",
"Lincolnshire"
]
var sortedCounties : [ String ] = []
var selectedCounty : String? = nil
var currentCoordinate: CLLocationCoordinate2D! = nil
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.distanceFilter = 10.0
locationManager.pausesLocationUpdatesAutomatically = true
locationManager.requestWhenInUseAuthorization()
sortedCounties = countiesArray.sorted{ $0 < $1 }
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return sortedCounties.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CountyTableViewCell", for: indexPath) as! CountyTableViewCell
let county = sortedCounties[indexPath.row]
let countySites = england.counties[county]
var siteIsSelectable = false
if (countySites?.isEmpty)! == true {
cell.backgroundColor = .gray
cell.isUserInteractionEnabled = false
} else {
siteIsSelectable = true
cell.backgroundColor = .blue
cell.isUserInteractionEnabled = true
}
cell.setLabel(cellLabel: sortedCounties[indexPath.row], selectable: siteIsSelectable)
return cell
}
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toSitesTableVC" {
let sitesTableVC = segue.destination as? SitesTableVC
if let indexPath = self.tableView.indexPathForSelectedRow {
selectedCounty = sortedCounties[indexPath.row]
sitesTableVC?.selectedCounty = selectedCounty
sitesTableVC?.currentCoordinate = currentCoordinate
}
} else {
return
}
}
}
extension CountiesTableVC: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// get current location if avaialble
guard let currentLocation = locations.last else { return }
// get coordinates of current user location
currentCoordinate = currentLocation.coordinate
locationManager.stopUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse {
// authorized location status when app is in use; update current location
locationManager.startUpdatingLocation()
// implement additional logic if needed...
}
}
}
Любая помощь будет принята с благодарностью.Благодаря.