1 - Clicando no "Local1" vou para esse local. Ao fazer append nesta situação, o primeiro print mostra apenas o "Local1" e o segundo print mostra o "Local1" e "Local2", retrocedendo para a tableview, só vejo o "local1".
Neste caso o Local2 seria o mesmo que o Local1 por teres aberto o mapa fazendo tap no Local1, certo?
2 - Clicando num botão, vou para um local aleatório. Ao fazer append nesta situação, o primeiro print mostra "" e o segundo print mostra "", "Local2", retrocedendo para a tableview, só vejo o "local1".
Deu para perceber?
Ou seja, no tal ViewController o Array tem o valor que tu queres, o array do anterior é que não. Isso é porque o Array não é um reference type mas sim um value type. Se fosse uma reference, então ao alterares um alterarias o outro. Consigo visualizar várias maneiras de fazer o que tu queres:
- Ter um delegate que dispare quando necessário e indique ao ViewController anterior que precisa de actualizar o array com dados novos
- Ter uma propriedade que seja um closure e chamá-la quando queres adicionar um elemento
- Aceder ao último View Controller da navigation stack, ver se é um PlacesViewController e adicionar o elemento
- Ter uma propriedade to tipo PlacesViewController que colocas com o valor do PlacesViewController
- Enviar uma mensagem (através do notification center) e fazer as alteraçōes necessárias
Algumas destas soluçōes são mais tightly coupled (ou mesmo melhores) que as outras.
O que eu pessoalmente aconselhava era isto:
No teu MapViewController:
Código:
protocol MapViewControllerDelegate {
func should(addPlace place:Dictionary<String,String>)
}
class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
var places = [Dictionary<String,String>()]
var delegate : MapViewControllerDelegate?
Depois adicionas o delegate method:
Código:
func should(addPlace place:Dictionary<String,String>){
self.delegate?.should(addPlace: place)
}
e chama-lo onde queres adicionar a localização, onde meteste anteriormente o 2o print.
No teu outro View controller:
Primeiro adicionas o delegate:
Código:
class ... , MapViewControllerDelegate {
depois declaras (e usas) o delegate method:
Código:
func should(addPlace place:Dictionary<String,String>){
places.append(place)
}
Não te esqueças de fazer set ao delegate:
Código:
...
if segue.identifier == "toMap"{
if let mapViewController = segue.destination as? MapViewController{
mapViewController.activePlace = activePlace
mapViewController.places = places
mapViewController.delegate = self
}
...
Já agora, muda:
para:
Código:
(placemarks, error)
[weak self] in
Aconselho-te a ler sobre Strong/Weak references para compreenderes o que quero dizer, se for preciso pergunta que eu explico