Комментарии 6
Так много вопросов к коду:
enum CodingKeys
у InitialCoords не нужен;Метод `init(from decoder) у InitialCoords тоже не нужен;
Зачем
var ymkMapView: YMKMapView!
, если можно простоvar ymkMapView: YMKMapView
(без восклицательного знака). И потом вinit
до вызоваsuper.init
присвоить значениеymkMapView
try!
плохая практика, что будет, если придет JSON, который не будет соответствовать структуре?mapView = MapView()
: каждый раз при вызове методаview()
будет создаваться новыйMapView
, можно просто объявитьlet mapView = MapView()
Здравствуйте! Спасибо за замечания, учту! В свифте новичок)
так-с, я скоро немножко исправлю код в статье, но есть некоторые нюансы:
1, 2) действительно, работает и без этого
3) Поменял методы init у MapView:
override init(frame: CGRect) {
ymkMapView = YMKMapView(frame: CGRect.zero, vulkanPreferred: isSimulator())
super.init(frame: frame)
clipsToBounds = true
addSubview(ymkMapView)
}
required init?(coder aDecoder: NSCoder) {
ymkMapView = YMKMapView(frame: CGRect.zero, vulkanPreferred: isSimulator())
super.init(coder: aDecoder)
clipsToBounds = true
addSubview(ymkMapView)
}
4) Исправил на вот такую конструкцию:
if let json = try? JSONSerialization.data(withJSONObject: initialRegion, options: []) {
if let region: InitialCoords = try? JSONDecoder().decode(InitialCoords.self, from: json) {
let cameraPoint = YMKPoint(latitude: region.lat, longitude: region.lon)
let cameraPosition = YMKCameraPosition(target: cameraPoint, zoom: region.zoom, azimuth: region.azimuth, tilt: region.tilt)
ymkMapView.mapWindow.map.move(with: cameraPosition, animationType: YMKAnimation(type: YMKAnimationType.smooth, duration: 0), cameraCallback: nil)
}
}
Если схема объекта неверная, то настройки просто не применятся.
5) Убрал переменную mapView из MapViewManager, но оставил создание MapView при каждом вызове view(), потому что иначе приложение будет крашится (в рн есть основной поток (UI) и побочный поток, в котором по дефолту делаются любые действия нативного модуля). Получилось как-то так:
@objc(MapViewManager)
class MapViewManager: RCTViewManager {
override static func requiresMainQueueSetup() -> Bool {
true
}
override func view() -> UIView! {
return MapView()
}
}
Примеры кода для модуля взял тут
@movpushmov@2Grey Привет. У вас есть пример кода с полным объяснением процесса? Я пытался создать такое решение, но оно не запускается из-за различных ошибок.
заранее спасибо
Здравствуйте! Не знаю, актуально или нет, но всё это дело лежало + лежит на моём гитхабе
https://github.com/movpushmov/react-native-yandex-mapkit
Написание нативных Swift модулей для React Native на примере Yandex Mapkit