2017-01-26 7 views
0

をマッピングするためにアノテーションを追加しない、私は経度を通過させることによって、他のVCから座標を受信し、そのようなのようなグローバルアレイを通して緯度午前:スウィフトのMapViewは私のMapViewためだから

配列に緯度と経度の追加:

func add(newLocation location_one:[String:Any]) { 
     let momentaryLat = (location_one["latitude"] as! NSString).doubleValue 
     let momentaryLong = (location_one["longitude"] as! NSString).doubleValue 
     let annotation = MKPointAnnotation() 
     annotation.title = location_one["title"] as? String 
     annotation.coordinate = CLLocationCoordinate2D(latitude: momentaryLat as CLLocationDegrees, longitude: momentaryLong as CLLocationDegrees) 
     map.addAnnotation(annotation) 

     //  self.map.centerCoordinate = annotation.coordinate 
    } 

viewForannotationコード:

MapViewVC上の座標を受信します

func mapView(_ map: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 



    let identifier = "pinAnnotation" 
    var annotationView = map.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView 

    if annotationView == nil { 
     annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) 
     annotationView?.canShowCallout = true 
    } 

    annotationView?.annotation = annotation 
    return annotationView 
} 

座標が正しく転送されており、func addが呼び出されています(break文を使用して検証されています)。ただし、シミュレータのMapViewに移動するとアノテーションが配置されません。テストされている別のAppでこれが正しく動作していたため、何が起こっているのか分かりませんが、何が原因か分かりません。

私はまた、ユーザーの現在の場所を見つけて、それに基づいてピンを配置するコードを持っています。おそらく、その座標コードを追加すると混乱する可能性がありますか?

+0

万一、マップオブジェクトにデリゲートを設定し、viewForAnnotationメソッドを実装しましたか? – apineda

+0

@Rob momentary瞬間的に正しく座標を受け取って、その部分が良いと思います。 viewForAnnotationを含めるように質問を編集しました。私のアプリは、現在の場所の注釈を表示することで正しく機能したので、正しく実装されているかどうかはわかりません。 – Kevin

+0

@apineda私は自己のviewDidLoad()でself.map.delegate = selfを設定します。また、viewForAnnotationメソッドを含めるように質問を編集しましたが、正しく実装しているかどうかはわかりません。 – Kevin

答えて

2

私はmomentaryLatmomentaryLongの数値を二重にチェックすることをお勧めします。なぜなら、問題を解析することによって、彼らはあなたが思うものではない可能性があります(例えば、大西洋!)。私たちはlocation_one["latitude"]の値がNSStringに変換される前の値であって、その値を二重に抽出していなければなりません。それを別々のステップに分割して、問題があなたに飛び出すでしょう。


viewForは正常です。無関係な、をifステートメントのelse節の中に入れることをお勧めします。annotationを設定する必要はありません。MKPinAnnotationViewを同じものを使用して作成した場合、注釈ビューを再利用する場合にのみこれを行う必要があります) 。また、私は通常、注釈がMKUserLocationではないことを確認することをお勧めします。なぜなら、一般的に、マップビューで表示させるためです。

func mapView(_ map: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
    if annotation is MKUserLocation { return nil } // let the OS show user locations itself 

    let identifier = "pinAnnotation" 
    var annotationView = map.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView 

    if annotationView == nil { 
     annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) 
     annotationView?.canShowCallout = true 
    } else { 
     annotationView?.annotation = annotation 
    } 

    return annotationView 
} 

しかし、これらの2つの観測のいずれも、欠落している注釈の問題とは関係ありません。


マップのannotationsの1つ以上がマップの可視部分内に入ると、それは従ってそれが必要と結論coordinateを有する場合メソッドのみが呼び出され、(スイフト3またはviewForviewForAnnotationを覚え関連付けられた注釈ビューをレンダリングします。したがって、(a)マップがそれ自身を描画しようとし、(b)1つ以上の注釈がマップの可視部分内(またはその近く)に座標を持つまで、呼び出されるとは思わないでしょう。

たとえば、地図オブジェクトに100個の注釈が追加されていて、そのうちの10個だけが地図の表示部分に含まれている場合は、10個の注釈ビューのみが作成されます。また、5を表示から外し、7をスクロールして表示するようにスクロールすると、viewForAnnotationが新たに表示されるアノテーションごとに1回、さらに7回呼び出されます。 viewForAnnotationは、スクロールして表示された5つの注釈ビューをデキュー/再利用し、2つの追加注釈ビューの新しい注釈ビューのみを作成します。 (それはそれより複雑ですが、それは基本的な考え方です。)

これは、表示されているセルに対してのみセルが作成されるテーブル/コレクションビューに似ています。したがって、モデルに100個のオブジェクトがあり、表に12行しか表示されていない場合は、12個のセルしか作成しません。行が表示外にスクロールすると、ビューにスクロールする将来の行のデキュー/再利用に使用できるようになります。これは、iOS全体で見られる共通のパターンです。計算量の多いビューオブジェクトは必要に応じて作成され、可能な限り再利用されます。

+0

それを分解することは少し助けになった!私は自分の配列に座標を入れるためのコードが正しい場所にないことに気付きました。これを実行した後、location_one ["latitude"]の出力はOptional( "40.713054")であり、瞬間緯度は40.713054を出力しています。しかし、それはまだ場所に注釈を配置していません。 – Kevin

+0

OK、これを把握するためのデバッグのスキルがあります。アノテーションオブジェクトの 'coordinate'値をマップの' annotations'の配列に追加する直前に見てください。'viewFor'でそれを見てください。注釈が適切な場所にないか、何らかの理由で追加されないのでしょうか? – Rob

+0

viewForメソッドが何をしているのか理解していますが、コード内の各行を理解できません。 viewForでアノテーションの座標値を探すことがどういう意味なのかよく分かりません。配列に追加される前の注釈は、CLLocationCoordinate2D(緯度:40.713054、経度:-74.007)です。そして注釈は全く配置されていません。 – Kevin