#swift #xcode #swiftui
#быстрый #xcode #свифтуи
Вопрос:
Прежде чем я опубликую свой код, я должен сказать вам, что мой код выполняется в проекте, а во втором проекте не выполняется!
Ошибка, которую я получаю, это:
[MKCoreLocationProvider] CLLocationManager(<CLLocationManager: 0x280cfc050>) for <MKCoreLocationProvider: 0x283cd0870> did fail with error: Error Domain=kCLErrorDomain Code=1 "(null)"
Это действительно связано с тем, почему мой код запускается в проекте, а проект, над которым я сейчас работаю, — нет! и я использую ту же версию ios 14.
- Просмотр карты
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) {
}
}
- Координатор
import Foundation
import MapKit
class Coordinator: NSObject, MKMapViewDelegate {
var control: MapView
init(_ control: MapView) {
self.control = control
}
}
- Менеджер по местоположению
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()
функцию, а у одного из них ее нет.