ESRI IOS Разработка приложений - иметь "sketchEditor.start (with:") сохранять ранее нарисованную графику при переключении между типами чертежей - PullRequest
1 голос
/ 17 января 2020

Я новичок в Swift и создаю ГИС-приложение, используя ArcGIS Runtime для IOS, чтобы узнать больше. Часть приложения дает кому-то возможность рисовать временную графику поверх карты. Прямо сейчас, когда я переключаюсь между точкой / полилинией / многоугольником, графика для всего, что было нарисовано ранее, удаляется, и мне было интересно, есть ли способ сохранить их там, пока не нажата кнопка «CLEAR».

Я верю, что ответ лежит в self.sketchEditor.start (с: nil, creationMode: [draw style])

"nil" стирает то, что было раньше, но я не могу понять, что мне нужно замените его на то, чтобы оно сохраняло любую нарисованную в данный момент графику.

Ниже приведен мой код, любая помощь будет принята с благодарностью.

//
//  ViewController.swift
//  [name]
//
//  Created by 
//  
//

import UIKit
import ArcGIS
import MessageUI

class ViewController: UIViewController {

    @IBOutlet weak var mapView: AGSMapView!
    @IBOutlet weak var geometrySegmentedControl: UISegmentedControl!
    @IBOutlet weak var undoBBI: UIButton!
    @IBOutlet weak var clearBBI: UIButton!

    private var map: AGSMap!
    private var sketchEditor: AGSSketchEditor!

    private func setupMap() {
        let itemID = [portal map]
        let portal = AGSPortal(url: URL(string: "https://www.arcgis.com")!, loginRequired: false)
        let portalItem: AGSPortalItem = AGSPortalItem(portal: portal, itemID: itemID)
        mapView.map = AGSMap(item: portalItem)
    }

    private func showAlert(withStatus: String) {
        let alertController = UIAlertController(title: "Alert", message:
            withStatus, preferredStyle: UIAlertController.Style.alert)
        alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertAction.Style.default,handler: nil))
        present(alertController, animated: true, completion: nil)
    }

    func setupLocationDisplay() {
        mapView.locationDisplay.autoPanMode = AGSLocationDisplayAutoPanMode.compassNavigation
        mapView.locationDisplay.start { [weak self] (error:Error?) -> Void in
            if let error = error {
                self?.showAlert(withStatus: error.localizedDescription)
            }
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        setupMap()

        setupLocationDisplay()

        let itemID = [portal]
        let portal = AGSPortal(url: URL(string: "https://www.arcgis.com")!, loginRequired: false)
        let portalItem: AGSPortalItem = AGSPortalItem(portal: portal, itemID: itemID)
        self.map = AGSMap(item: portalItem)

        self.sketchEditor = AGSSketchEditor()
        self.mapView.sketchEditor = self.sketchEditor

        self.sketchEditor.start(with: nil, creationMode: .unset)

        self.mapView.map = self.map
        self.mapView.interactionOptions.isMagnifierEnabled = false

        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.respondToGeomChanged), name: .AGSSketchEditorGeometryDidChange, object: nil)
    }

    @objc
    func respondToGeomChanged() {
        //Enable/disable UI elements appropriately
        self.undoBBI.isSelected = self.sketchEditor.undoManager.canUndo
        self.clearBBI.isSelected = self.sketchEditor.geometry != nil && !self.sketchEditor.geometry!.isEmpty
    }

    // MARK: - Actions

    @IBAction func geometryValueChanged(_ geometrySegmentedControl: UISegmentedControl) {
        switch geometrySegmentedControl.selectedSegmentIndex {
        case 0://multipoint
            self.sketchEditor.start(with: nil, creationMode: .unset)

        case 1://freehand polyline
            self.sketchEditor.start(with: nil, creationMode: .freehandPolyline)

        case 2://freehand polygon
            self.sketchEditor.start(with: nil, creationMode: .freehandPolygon)

        case 3://multipoint
            self.sketchEditor.start(with: nil, creationMode: .multipoint)

        default:
            break
        }

        self.mapView.sketchEditor = self.sketchEditor
    }

    @IBAction func undo() {
        if self.sketchEditor.undoManager.canUndo { //extra check, just to be sure
            self.sketchEditor.undoManager.undo()
        }
    }

    @IBAction func clear() {
        self.sketchEditor.clearGeometry()
    }
}
...