2016-03-28 9 views
1

Я делаю небольшое приложение карты. Я хочу, чтобы иметь возможность сбросить контакты (воспоминания), пользователь упал. Я хочу, чтобы это было сделано с помощью кнопки «Сброс памяти», отображаются с помощью поповера:Сбросить карты с помощью кнопки через Popover

enter image description here

У меня есть этот код для моего основного класса контроллера представления, который обрабатывает карту и т.д.:

import UIKit 
import MapKit 
import CoreLocation 

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate, UISearchBarDelegate, UIPopoverPresentationControllerDelegate { 

    var location: CLLocation! 
    let locationManager = CLLocationManager() 

    @IBOutlet weak var placesMap: MKMapView! 
    @IBOutlet weak var addButton: UIBarButtonItem! 
    @IBOutlet weak var moreStuff: UIButton! 

    // Popover button action 
    @IBAction func moreStuff(sender: AnyObject) { 
     self.performSegueWithIdentifier("showMoreStuff", sender:self) 
     moreStuff.adjustsImageWhenHighlighted = false 
    } 

    @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() 
    } 

    // Location function 
    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() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.locationManager.delegate = self 
     self.locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     self.locationManager.requestWhenInUseAuthorization() 
     self.locationManager.startUpdatingLocation() 
     self.placesMap?.showsUserLocation = true 
     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) 
      } 
     } 
    } 

Вот выход и действие для кнопки «Сбросить память», этот код хранится в новом классе для popover с именем «PopoverOptions». В настоящее время при нажатии кнопки, не контакты удаляются с карты:

@IBOutlet weak var resetMemories: UIButton! 

@IBAction func resetMemories(sender: AnyObject) { 
    func removeStoredLocations(){ 
     NSUserDefaults.standardUserDefaults().removeObjectForKey("locationArray") 
     NSUserDefaults.standardUserDefaults().synchronize() 
    } 
} 

Любая помощь, чтобы получить эту работу оценили, я новичок в Swift

ответ

0

Вы обновляете массив подкладочный, но не карта просматривать себя. Добавить placesMap.removeAnnotations(placesMap.annotations) в resetMemories().


Обновлено: поскольку действие находится в другом файле, огонь уведомление от resetMemories():

NSNotificationCenter.defaultCenter().postNotificationName("memoriesUpdated", object: nil) 

Затем в контроллере представления прослушивать уведомления и обновлять контакты:

NSNotificationCenter.defaultCenter().addObserverForName("memoriesUpdated", object: nil, queue: nil) { [weak self] (n) -> Void in 
    // remove existing annotations 
    if let annotations = self?.placesMap.annotations { 
     self?.placesMap.removeAnnotations(annotations) 
    } 

    // add new annotations (if any) 
    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) 
     } 
    } 
} 
+0

Спасибо за ваш ответ :) Я попробовал ваше предложение, но поскольку функция resetMemories() находится в новом классе, он не может видеть placesMap! Есть ли у вас какие-либо дополнительные предложения? – Oscar

+0

Вы можете запустить уведомление из 'resetMemories()', а затем обновить аннотации при получении этого уведомления. Я отредактирую свой ответ. – jszumski

+0

Еще раз спасибо, я попробую это сейчас. Код контроллера просмотра следует вставить в функцию viewDidLoad правильно? – Oscar

 Смежные вопросы

  • Нет связанных вопросов^_^