Je suis nouveau sur Xcode et application mobile. Je fais une application pour trouver l'emplacement actuel. Je l'ai testé sur le simulateur et j'ai reçu ce message dans la console ... ". Impossible d'insérer l'attribution légale du coin 4" Qu'est-ce que cela signifie et comment puis-je résoudre ce problème?
import UIKit
import Alamofire
import AlamofireImage
import MapKit
import CoreLocation
class MapVC: UIViewController
@IBOutlet weak var mapView: MKMapView!
var locationManager = CLLocationManager()
let authorizationStatus = CLLocationManager.authorizationStatus()
let regionRadius: Double = 1000
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
locationManager.delegate = self
configureLocationServices()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func centerMapPressed(_ sender: Any) {
if authorizationStatus == .authorizedAlways || authorizationStatus == .authorizedWhenInUse{
centerMapOnUserLocation()
}
}
MKMapViewDelegate:
func centerMapOnUserLocation(){
guard let coordinate = locationManager.location?.coordinate else{return}
let coordinateRegion = MKCoordinateRegionMakeWithDistance(coordinate, regionRadius*2.0, regionRadius * 2.0 )
mapView.setRegion(coordinateRegion, animated: true)
}
CLLocationManagerDelegate:
func configureLocationServices(){
if authorizationStatus == .notDetermined{
locationManager.requestAlwaysAuthorization()
}else{
return}
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
centerMapOnUserLocation()
}
ce problème se produit lorsque les informations requises sous la bonne forme ne sont pas trouvées. si votre appareil tente d'obtenir un emplacement ou une variable numérique a
et que cette variable a
est requise pour afun
.. la valeur n'est pas définie dans a
, mais afun
est appelé pour indiquer que cette erreur se produit ..
appelez les coordonnées de votre cellule dans viewdidload
sans autre fonction.
Voici le moyen le plus simple d'obtenir la position de votre cellule. 1. vous devriez avoir mis à jour les données confidentielles des périphériques sous infor.plist
Ajoutez les lignes suivantes dans votre plist avant de fermer la balise
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Privacy - Location Always and When In Use Usage Description</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Privacy - Location Always Usage Description</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Privacy - Location When In Use Usage Description</string>
après cela .. c'est le code de travail le plus simple .. je l'utilise avec bonheur sans problème ..
import CoreLocation
import MapKit
class AddressVc: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {
@IBOutlet weak var map: MKMapView!
var locationManager = CLLocationManager()
voici le code pour déplacer la carte dans le centre pour l'emplacement souhaité
let latDelta:Double = 0.5
let lngDelta:Double = 0.5
let latitude:Double = 37.57554038
let longitude:Double = -122.40068475
let locationcoordinates = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
let zoomSpan = MKCoordinateSpan(latitudeDelta: latDelta, longitudeDelta: lngDelta)
let region = MKCoordinateRegion(center: locationcoordinates, span: zoomSpan)
self.map.setRegion(region, animated: true)
dans le code ci-dessus .. si vous indiquez la latitude et la lognitude des positions lat et gn de l'appareil pour déplacer la carte vers l'emplacement de vos appareils.
maintenant comment obtenir l'emplacement de l'appareil. voici le code que vous pouvez mettre dans votre fonction viewDidLoad()
.
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// device latitude = (locationManager.location?.coordinate.latitude)!
// device longitude = (locationManager.location?.coordinate.longitude)!
}
il s'agit de détecter les valeurs de latitude et de longitude de l'appareil. vous pouvez les mettre dans le code mentionné ci-dessus.
Voici le code complet.
import CoreLocation
import MapKit
class AddressVc: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {
@IBOutlet weak var map: MKMapView!
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
devicelatitude = (locationManager.location?.coordinate.latitude)!
devicelongitude = (locationManager.location?.coordinate.longitude)!
let latDelta:Double = 0.5
let lngDelta:Double = 0.5
let latitude:Double = devicelatitude
let longitude:Double = devicelongitude
let locationcoordinates = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
let zoomSpan = MKCoordinateSpan(latitudeDelta: latDelta, longitudeDelta: lngDelta)
let region = MKCoordinateRegion(center: locationcoordinates, span: zoomSpan)
self.map.setRegion(region, animated: true)
}
J'espère que cela vous aidera… sinon… il y aurait beaucoup d'autres personnes confrontées à ce problème.
==========================
Cette erreur se produit lorsque le lien "Légal" en bas à gauche de MapView n'est pas compris ou est masqué. Des erreurs similaires concernant l’échelle de la carte et la boussole apparaissent lors de la rotation.
Pensez à utiliser des contraintes de taille ou une safeAreaInset
.
Avec le simulateur ouvert, accédez au menu DEBUG dans la barre supérieure du mac. La dernière option est l'emplacement, le mien affichant cette erreur lorsqu'il est défini sur NONE. Définissez-le d'abord avec vous. Invitez-le à choisir un emplacement dans une nouvelle fenêtre, remplissez-le, fermez le simulateur et relancez l'application. Il devrait maintenant obtenir l'emplacement personnalisé à partir de votre code. (crédit andrecasarini)
Je crois que le bogue juridique inséré se trouve dans le code d'initialisation du mapkit d'Apple et n'a aucun lien avec ce que nous faisons lorsque nous utilisons le code. Voici mon raisonnement.
Si vous utilisez des storyboards et le module de glisser-déposer UIMapKit, l'erreur d'encadré légale apparaît quelque part entre l'appel à l'appel initial à application dans le délégué de l'application et le premier viewDidLoad call, c'est-à-dire Erreur du système d'exploitation.
Je me suis demandé si je pouvais contourner le problème et j'ai écrit une version qui n'utilise pas l'éditeur de storyboard. Je pensais que l'éditeur insérait peut-être un code erroné dans l'application. Mon application de test comporte deux vues, la vue de démarrage et une seconde vue contenant la carte. Le code est indiqué ci-dessous. Ne soyez pas dur, c'est ma première tentative de comprendre ce qui se passe avec les vues et les sous-vues des contrôleurs à l'aide de vues et de sous-vues programmatiques. Ce n'est pas joli mais cela fonctionne pour isoler le bug d'encart légal.
J'ai commencé par construire un nouveau projet xcode et supprimer le storyboard. J'ai ensuite remplacé le fichier application function stub dans appdelegate par le code suivant:
func application(_ application: UIApplication, didFinishLaunchingWithOptions
launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
self.window = UIWindow(frame: UIScreen.main.bounds)
let viewController = ViewController()
self.window?.rootViewController = viewController
self.window?.makeKeyAndVisible()
let mapView = mapViewController()
mapView.otherView = viewController
viewController.mapView = mapView
return true
}
Même si mapView est créé ici, l'erreur d'encadré légale ne s'affiche pas. Ce que fait montrent sont quelques autres messages à propos de l’échelle et de la boussole qui ont un problème. Puisque je me concentrais sur le bug d'encart légal, je les ai ignorés et je suis passé à autre chose.
J'ai ensuite remplacé le contrôleur de vue par défaut par un code créant deux sous-vues, une sous-vue servant de bouton permettant de basculer vers le deuxième contrôleur de vue et la deuxième sous-vue servant de marqueur. Cela nécessitait de savoir comment gérer un robinet. Le code de changement de couleur dans le gestionnaire de tap était initial "hello world. Je vois un code de tap" et ne sert à rien.
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController,CLLocationManagerDelegate {
let DynamicView = UIView()
let switchView = UIView(frame: CGRect(x: UIScreen.main.bounds.minX+10, y: UIScreen.main.bounds.minY+20, width: 40, height: 40))
public var mapView:mapViewController? = nil
public var otherView:UIViewController? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = .white
DynamicView.backgroundColor = .yellow
DynamicView.layer.cornerRadius = 25
DynamicView.layer.borderWidth = 2
switchView.backgroundColor = .orange
switchView.layer.borderWidth = 2
var gR = UITapGestureRecognizer(target: self, action:#selector(self.handlebigTap(_:)))
DynamicView.addGestureRecognizer(gR)
gR = UITapGestureRecognizer(target: self, action:#selector(self.handlesmallTap(_:)))
switchView.addGestureRecognizer(gR)
self.view.addSubview(switchView)
self.view.addSubview(DynamicView)
DynamicView.translatesAutoresizingMaskIntoConstraints = false
let margins = view.layoutMarginsGuide
DynamicView.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 10).isActive = true
DynamicView.trailingAnchor.constraint(equalTo: margins.trailingAnchor, constant: 10).isActive = true
DynamicView.topAnchor.constraint(equalTo: margins.topAnchor, constant: 40).isActive = true
DynamicView.bottomAnchor.constraint(equalTo: margins.topAnchor, constant: 110).isActive = true
}
@objc func handlebigTap(_ sender: UITapGestureRecognizer) {
if ( self.DynamicView.backgroundColor == .green){
self.DynamicView.backgroundColor = .blue
} else {
self.DynamicView.backgroundColor = .green
}
}
@objc func handlesmallTap(_ sender: UITapGestureRecognizer) {
if ( self.switchView.backgroundColor == .orange){
self.switchView.backgroundColor = .blue
present(mapView!, animated: true, completion: nil)
} else {
self.switchView.backgroundColor = .orange
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
À ce stade, j'ai vérifié si le premier appel à viewDidLoad avait déclenché l'erreur d'encart légal et constaté que ce n'était pas le cas. Cela signifiait que l'erreur était déclenchée quelque part dans le code d'initialisation de mapKit qui n'était pas encore construit. J'ai simplement copié et collé le premier viewController dans un nouveau fichier et appelé ce mapViewController. J'ai commenté le code DynamicView restant du premier contrôleur et ajouté le code d'initialisation mapKit comme indiqué ici:
import UIKit
import MapKit
import CoreLocation
class mapViewController: UIViewController,CLLocationManagerDelegate,MKMapViewDelegate {
let DynamicView = UIView(frame: CGRect(x: UIScreen.main.bounds.maxX-110, y: UIScreen.main.bounds.maxY-110, width: 100, height: 100))
let switchView = UIView(frame: CGRect(x: UIScreen.main.bounds.minX+10, y: UIScreen.main.bounds.minY+20, width: 40, height: 40))
var mapView = MKMapView()
public var otherView:UIViewController? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = .white
// DynamicView.backgroundColor = .yellow
// DynamicView.layer.cornerRadius = 25
// DynamicView.layer.borderWidth = 2
switchView.backgroundColor = .orange
switchView.layer.borderWidth = 2
var gR = UITapGestureRecognizer(target: self, action:#selector(self.handlebigTap(_:)))
DynamicView.addGestureRecognizer(gR)
gR = UITapGestureRecognizer(target: self, action:#selector(self.handlesmallTap(_:)))
switchView.addGestureRecognizer(gR)
self.view.addSubview(switchView)
// self.view.addSubview(DynamicView)
// mapView.frame = CGRect(x: 10, y: 60, width: view.frame.size.width-20, height: 300)
mapView.mapType = MKMapType.standard
mapView.isZoomEnabled = true
mapView.isScrollEnabled = true
view.addSubview(mapView)
mapView.translatesAutoresizingMaskIntoConstraints = false
let margins = view.layoutMarginsGuide
mapView.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 10).isActive = true
mapView.trailingAnchor.constraint(equalTo: margins.trailingAnchor, constant: 0).isActive = true
mapView.topAnchor.constraint(equalTo: margins.topAnchor, constant: 45).isActive = true
mapView.bottomAnchor.constraint(equalTo: margins.bottomAnchor, constant: -20).isActive = true
}
@objc func handlebigTap(_ sender: UITapGestureRecognizer) {
if ( self.DynamicView.backgroundColor == .green){
self.DynamicView.backgroundColor = .blue
} else {
self.DynamicView.backgroundColor = .green
}
}
@objc func handlesmallTap(_ sender: UITapGestureRecognizer) {
if ( self.switchView.backgroundColor == .orange){
self.switchView.backgroundColor = .blue
dismiss(animated: true, completion: nil)
} else {
self.switchView.backgroundColor = .orange
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
}
}
J'ai parcouru le code ci-dessus et je suis allé à la recherche du message d'encart légal à afficher. C'est la ligne incriminée:
mapView.frame = CGRect (x: 10, y: 60, largeur: vue.frame.size.width-20, hauteur: 300)
Dès que la vue est encadrée, le message d'erreur s'affiche. Peu importe les dimensions que vous donnez à la vue, le message apparaît. OK .... Peut-être que le message attend un cadrage basé sur des contraintes au lieu d'un code codé en dur par la ligne incriminée.
J'ai commenté la ligne et ajouté des contraintes à la vue et l'erreur est toujours apparue.
À ce stade, j'ai abandonné. Je ne savais pas comment configurer une vue cartographique pour que le message d'erreur n'apparaisse pas. Espérons qu'Apple se montrera responsable et dira quelque chose à ce stade ou que quelqu'un d'autre prendra le relais pour voir s'il existe un moyen de configurer Mapkit pour qu'il cesse de générer des messages d'erreur.
En ce qui me concerne au moins, j'ai appris à ajouter de manière dynamique des vues, des sous-vues, des reconnaisseurs de mouvements et des contraintes, de manière à optimiser mon temps de recherche du bogue. Merci à tous ceux qui ont posté un exemple de code de vue dynamique, de code de reconnaissance de geste, de code de sous-vue et de code de contrainte. Vous pouvez reconnaître un peu de votre code ici.