Не удается отобразить местоположение пользователя SwiftUI

#swift #xcode #swiftui

#быстрый #xcode #свифтуи

Вопрос:

Прежде чем я опубликую свой код, я должен сказать вам, что мой код выполняется в проекте, а во втором проекте не выполняется!

Ошибка, которую я получаю, это:

 [MKCoreLocationProvider] CLLocationManager(<CLLocationManager: 0x280cfc050>) for <MKCoreLocationProvider: 0x283cd0870> did fail with error: Error Domain=kCLErrorDomain Code=1 "(null)"
 

Это действительно связано с тем, почему мой код запускается в проекте, а проект, над которым я сейчас работаю, — нет! и я использую ту же версию ios 14.

  1. Просмотр карты
 import Foundation
import UIKit
import SwiftUI
import MapKit
    
struct MapView: UIViewRepresentable {
        
 typealias UIViewType = UIView
        
        
  func makeCoordinator() -> Coordinator {
            Coordinator(self)
  }
             
  func makeUIView(context: Context) -> UIView {
            let map = MKMapView()
            
            map.delegate = context.coordinator
            map.showsUserLocation = true
            return map
  }
        
  func updateUIView(_ uiView: UIView, context: Context) {
            
  }
              
}
 
  1. Координатор
 import Foundation
import MapKit

class Coordinator: NSObject, MKMapViewDelegate {
        
 var control: MapView
        
 init(_ control: MapView) {
            self.control = control
 }
        
        
}
 
  1. Менеджер по местоположению
 class GetUserLocation: NSObject, ObservableObject, CLLocationManagerDelegate {
        
 let locationManager = CLLocationManager()
 @Published var location: CLLocation? = nil
        
 override init() {
  super.init()
            
  self.locationManager.delegate = self
  self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
  self.locationManager.distanceFilter = kCLDistanceFilterNone
  self.locationManager.requestWhenInUseAuthorization()
  self.locationManager.startUpdatingLocation()
            
 }
        
        
  func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
           
            guard let location = locations.last else {
                return
            }
            
            self.location = location
  }
        
        
}
 

Комментарии:

1. Включили ли вы одни и те же возможности для обоих проектов в Xcode?

2. @JoakimDanielson да, все точно так же, и список также обновляется

3. Что я обнаружил, так это то, что init в файле LocationManager под номером 3 не вызывается, я не знаю почему !!?

Ответ №1:

После некоторого отдыха я начал отлаживать проблему, я обнаружил, что init() функция не вызывается в файле 3. Location manager .

Я попытался инициализировать объект из других файлов и угадать, что он работал без каких-либо проблем, еще одна проводная вещь здесь!

Таким init() образом, функция вызывается из других файлов, однако в 4. UserLocationMapView ней не вызывается, и я не мог понять, почему!

Выпив чашку кофе, я обнаружил, что при SceneDelegate вызове неправильного файла просмотра у меня UserLocationMapView отображалась карта, однако я звонил 3. MapView SceneDelegate .

Это глупая ошибка, когда вы вызываете оба файла SceneDelegate , они отображают карту без проблем. Поэтому, когда вы видите, что карта отображается в симуляторе, вы подумаете, что она работает, однако один из них вызывает init() функцию, а у одного из них ее нет.