37314


コメントのような文章を投稿し、それを地図上に表示させる形式のSNSアプリを開発しています。  
Googlemap APIとfirebaseのRealtime Databaseを利用しています。  
現状、ログイン、投稿画面、地図の表示は済み、地図上にコンテンツを一つmarkerとして表示させるところまでは進みましたが、地図上に複数のコンテンツを表示させる方法がわからず困っております。  
何卒ご教示頂ければ幸いです。

  
下記クラスでfirebase側から投稿データを取得しています  
**PostData.swift**

[code]

    class PostData: NSObject {
      var id: String?
      var userName: String?
      var text: String?
      var latitude: String?
      var longitude: String?
    
      init(snapshot: DataSnapshot, myId: String) {
        self.id = snapshot.key
    
        let valueDictionary = snapshot.value as! [String: AnyObject]
    
        self.latitude = valueDictionary["latitude"] as? String
        self.longitude = valueDictionary["longitude"] as? String
    
        self.text = valueDictionary["text"] as? String
    
        self.userName = valueDictionary["userName"] as? String
    
      }
    }
    
[/code]

  
  
下記はメインの地図画面クラスです  
**Map_ViewController.swift**

[code]

    class Map_ViewController: UIViewController, CLLocationManagerDelegate, GMSMapViewDelegate{
    
      var mapManager: CLLocationManager = CLLocationManager()
      var latitude: CLLocationDegrees!
      var longitude: CLLocationDegrees!
      var gmaps: GMSMapView!
      var postArray: [PostData] = []
      var observing = false
      var marker = GMSMarker()
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
        mapManager = CLLocationManager()
        latitude = CLLocationDegrees()
        longitude = CLLocationDegrees()
    
        mapManager.delegate = self
        mapManager.requestWhenInUseAuthorization()
        mapManager.requestAlwaysAuthorization()
        mapManager.desiredAccuracy = kCLLocationAccuracyBest
        mapManager.distanceFilter = 1000
        mapManager.startUpdatingLocation()
    
        gmaps = GMSMapView(frame: CGRect(x:0, y:0, width:self.view.bounds.width, height:self.view.bounds.width))
        self.view.addSubview(gmaps)
        gmaps.isMyLocationEnabled = true
        gmaps.settings.compassButton = true
    
        self.view = gmaps
        gmaps.delegate = self
    
        if Auth.auth().currentUser != nil {
          if self.observing == false {
    
            let postsRef = Database.database().reference().child("messages")
            postsRef.observe(.childAdded, with: { snapshot in
    
              if let uid = Auth.auth().currentUser?.uid {
                let postData = PostData(snapshot: snapshot, myId: uid)
                self.postArray.insert(postData, at: 0)
                print("\(self.postArray)")
    
                for element in self.postArray{
                 self.makeMarker(postData: element)
                }
    
              }   
            })
          }
        }
      }
    
       func makeMarker(postData: PostData) -> GMSMarker {
    
          let latitude = Double(postData.latitude!)
          let longitude = Double(postData.longitude!)
    
          marker.position = CLLocationCoordinate2D(latitude: latitude!, longitude: longitude!)
    
          marker.title = "\(postData.text!)"
          marker.tracksInfoWindowChanges = true //情報ウィンドウを自動的に更新するように設定する
          marker.appearAnimation = GMSMarkerAnimation.pop //マーカーの表示にアニメーションをつける
          gmaps.selectedMarker = marker //デフォルトで情報ウィンドウを表示
          marker.map = self.gmaps
          return marker
          }
    
         //現在地の読み込み完了時に呼ばれるメソッド
         func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
          let userLocation:CLLocation = locations[0] as CLLocation
          latitude = userLocation.coordinate.latitude
          longitude = userLocation.coordinate.longitude
          let now :GMSCameraPosition = GMSCameraPosition.camera(withLatitude: latitude,longitude:longitude,zoom:14)
          gmaps.camera = now
        }
      }
    
[/code]

  
ログを見るとfor文でアクセスしている配列postArray内にデータは引いてこれているので、その要素すべてにアクセスはできているとは思うのですが、makeMarkerメソッドがその要素ひとつぶんにしかアクセスできておらずmarkerが一つしか出せない状況です。(説明が悪くすみません)  
forEach文に変えてみたりなどは試しましたが、結局1つしかmarkerを出せずといった感じです。

以上、アプローチの見直しも含めてご教示頂けますと幸いです。


CC BY-SA 3.0
2017-08-17T16:09:25.313
37294
2017-09-27T15:13:05.543
2017-09-27T15:13:05.543
369
23075
question
swift ios swift3 google-maps firebase
Firebaseから取得したデータをもとに地図上に複数のmarkerを表示したい


【解決しました！】  
下記の通り変更したところ、複数markerを表示できるようになりました！  
ご指導いただきました[OOPer](https://ja.stackoverflow.com/users/13972/ooper)さん、ありがとうございました！  
  
**Map_ViewController.swift**

[code]

    class Map_ViewController: UIViewController, CLLocationManagerDelegate, GMSMapViewDelegate{
    
      var mapManager: CLLocationManager = CLLocationManager()
      var latitude: CLLocationDegrees! = CLLocationDegrees()
      var longitude: CLLocationDegrees! = CLLocationDegrees()
      var gmaps: GMSMapView!
      var postArray: [PostData] = []
      var markers: [GMSMarker] = []
      var observing = false
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
        mapManager.delegate = self
        mapManager.requestWhenInUseAuthorization()
        mapManager.requestAlwaysAuthorization()
        mapManager.desiredAccuracy = kCLLocationAccuracyBest
        mapManager.distanceFilter = 1000
        mapManager.startUpdatingLocation()
    
        gmaps = GMSMapView(frame: CGRect(x:0, y:0, width:self.view.bounds.width, height:self.view.bounds.width))
        self.view.addSubview(gmaps)
        gmaps.isMyLocationEnabled = true
        gmaps.settings.compassButton = true
    
        self.view = gmaps
        gmaps.delegate = self
    
        if Auth.auth().currentUser != nil {
          if self.observing == false {
    
            let postsRef = Database.database().reference().child("messages")
            postsRef.observe(.childAdded, with: { snapshot in
    
              if let uid = Auth.auth().currentUser?.uid {
                let postData = PostData(snapshot: snapshot, myId: uid)
                self.postArray.insert(postData, at: 0)
                self.makeMarker(postData: postData)
              }   
            })
          }
        }
      }
    
      func makeMarker(postData: PostData) -> [GMSMarker] {
    
          let marker = GMSMarker()
          let latitude = Double(postData.latitude!)
          let longitude = Double(postData.longitude!)
    
          marker.position = CLLocationCoordinate2D(latitude: latitude!, longitude: longitude!)
    
          marker.title = "\(postData.text!)"
          marker.tracksInfoWindowChanges = true //情報ウィンドウを自動的に更新するように設定する
          marker.appearAnimation = GMSMarkerAnimation.pop //マーカーの表示にアニメーションをつける
          gmaps.selectedMarker = marker //デフォルトで情報ウィンドウを表示
          marker.map = self.gmaps
    
          markers = [marker]
    
          return markers
      }
    
         //現在地の読み込み完了時に呼ばれるメソッド
      func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let userLocation:CLLocation = locations[0] as CLLocation
        latitude = userLocation.coordinate.latitude
        longitude = userLocation.coordinate.longitude
        let now :GMSCameraPosition = GMSCameraPosition.camera(withLatitude: latitude,longitude:longitude,zoom:14)
        gmaps.camera = now
      }
    }
    
[/code]


CC BY-SA 3.0
2017-08-18T12:32:43.003
37314
2017-08-18T12:32:43.003
23075
37294
answer