Nano Hash - криптовалюты, майнинг, программирование

Сохранение контактов карты в массив, Swift

Я создаю приложение типа карты, как только пользователь нажимает кнопку, булавка перемещается на карту в их текущем местоположении. Я пытаюсь сохранить контакты карты в массив, чтобы они оставались после закрытия приложения.

Вот мой код:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let location = locations.last
    let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
    let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.004, longitudeDelta: 0.004))
    self.placesMap?.setRegion(region, animated: true)
    self.locationManager.stopUpdatingLocation()
}

func locationManager(manager: CLLocationManager, didFailWithError error: NSError)
{
    print("Error code: " + error.localizedDescription)
}

// Add button action
@IBAction func addButton(sender: AnyObject) {
    let annotation = MKPointAnnotation()
    annotation.coordinate = CLLocationCoordinate2D(latitude: self.placesMap.userLocation.coordinate.latitude, longitude: self.placesMap.userLocation.coordinate.longitude)
    self.placesMap.addAnnotation(annotation)
    self.locationManager.startUpdatingLocation()
}

Как я могу сохранить информацию о выводе в массив, который перезагружается при каждом открытии приложения?


Ответы:


1

Если вы хотите сохранять данные между запусками приложения и не храните много данных, самый простой способ — использовать NSUserDefaults. Вы можете сделать это, сказав что-то вроде:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let location = locations.last
    let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
    let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.004, longitudeDelta: 0.004))
    self.placesMap?.setRegion(region, animated: true)
    self.locationManager.stopUpdatingLocation()



     let locationDictionary:[String:Double] = ["latitude":center.latitude,"longitude":center.longitude]
     var locationArray = [[String:Double]]()
     if NSUserDefaults.standardUserDefaults().objectForKey("locationArray") != nil {
        locationArray = NSUserDefaults.standardUserDefaults().objectForKey("locationArray") as! [[String:Double]]

    }

    locationArray.append(locationDictionary)

    NSUserDefaults.standardUserDefaults().setObject(locationArray, forKey: "locationArray")
    NSUserDefaults.standardUserDefaults().synchronize()
    }

Затем вам нужно будет прочитать эти местоположения, когда приложение перезапустится. Вы можете сделать это в viewDidLoad. Например:

override func viewDidLoad(){
    super.viewDidLoad()
    if NSUserDefaults.standardUserDefaults().objectForKey("locationArray") != nil {
    for dictionary in NSUserDefaults.standardUserDefaults().objectForKey("locationArray") as! [[String:Double]]{
        let center = CLLocationCoordinate2D(latitude: dictionary["latitude"]!, longitude: dictionary["longitude"]!)
        let annotation = MKPointAnnotation()
        annotation.coordinate = center
        self.placesMap.addAnnotation(annotation)
    }
  }
}

Если вы хотите удалить все сохраненные местоположения, вы можете сказать что-то вроде:

    func removeStoredLocations(){
     NSUserDefaults.standardUserDefaults().removeObjectForKey("locationArray")
     NSUserDefaults.standardUserDefaults().synchronize()
    }
18.03.2016
  • Большое спасибо за ваш ответ, я ценю это! Я попробовал то, что вы предложили, но все равно булавки на карте исчезают после перезапуска приложения :( есть идеи? 18.03.2016
  • В viewDidLoad поместите print(center) после let center = CLLocationCoordinate2D(latitude: dictionary["latitude"]!, longitude: dictionary["longitude"]!) Дайте мне знать, что написано в консоли. 18.03.2016
  • Пробовал, но ничего не выводится на консоль :( Я действительно не знаю, почему. Есть ли что-нибудь еще, что я могу попробовать заставить это работать? 18.03.2016
  • Поставьте точку останова или напечатайте что-нибудь в строке locationArray.append(locationDictionary) 18.03.2016
  • Теперь я получаю много информации CLLocationCoordinate2D, несколько строк значений широты и долготы, таких как: CLLocationCoordinate2D (широта: 51,4012167882653, долгота: -0,122878281399722), которая является последней напечатанной строкой. 18.03.2016
  • Отображаются ли регионы на карте? Если нет, то нужно просто взять эти координаты, создать регион и установить эти регионы на карте. Я не знаю, когда ваше представление карты будет добавлено в иерархию представлений, поэтому вам может понадобиться сделать это позже в жизненном цикле вашего контроллера представления. 18.03.2016
  • Нет, булавки не отображаются, когда я снова открываю карту. Я хочу, чтобы красные булавки оставались на своих местах до тех пор, пока пользователь не захочет их сбросить. Как мне создать булавку из сохраненных мест? Представление карты находится на главном контроллере представления, первая позиция в иерархии представлений. 18.03.2016
  • Потрясающий! Это показывает все контакты, которые я ранее сохранил до этого момента: D Есть ли простой способ сбросить массив, содержащий контакты? Я хочу, чтобы в идеале была кнопка сброса всех контактов. Большое спасибо за Вашу помощь 18.03.2016
  • Еще раз спасибо :) Однако теперь, когда я нажимаю кнопку удаления контактов, приложение вылетает. Я получаю эту ошибку в терминале: 2016-03-18 20:40:44.884 PlacesFinal[4287:2569682] *** Завершение приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[‹UITableView 0x12f064e00› setValue: forUndefinedKey:] : этот класс не соответствует кодированию значения ключа для ключа resetMemories.' Когда я проверяю, класс установлен правильно, поэтому я не знаю, почему это происходит :( 18.03.2016
  • Мое приложение отображает кнопку сброса контактов во всплывающем окне, это окно отображается поверх карты. Когда я нажимаю кнопку, чтобы показать всплывающее окно, приложение вылетает. 18.03.2016
  • Где вы используете tableView? Как вы загружаете данные? 19.03.2016
  • tableview - это таблица кнопок, которая включает кнопку сброса контактов, отображаемую через переход всплывающего окна, у меня есть отдельный класс для табличного представления с именем Popover, я также получаю уведомление о том, что Неизвестный класс Popover в файле Interface Builder. поэтому я думаю, может быть, он не видит файл класса? Я не уверен, как это исправить 19.03.2016
  • Класс закрытый? 19.03.2016
  • Нет, это не частное 19.03.2016
  • Вы используете xibs или раскадровки? 19.03.2016
  • Я использую раскадровки 19.03.2016
  • Привет, мне удалось избежать этой ошибки. Кнопка работает нормально, но код для удаления контактов по-прежнему ничего не делает. Можете ли вы как-нибудь помочь мне с этим, чтобы кнопка сброса контактов работала? Я разместил новый вопрос об этом 26.03.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..