2016-03-24 19 views
0

私はmapviewでテーブルビューではなく作業していますが、indexPath.rowの代わりに何を使うべきかわかりません。indexPath.rowの代わりに何を使用しますか?非テーブルのために?

注釈の情報ボタンが押されると、注釈付きのマップビューが表示されます。次に、CKデータベースに照会し、押された注釈の名前と一致する名前フィールドを持つレコードを返します。これは、一致する名前がないので、単一レコードの[CKRecord]を返します。私はデータにアクセスするには、次のだろうテーブルビューで、この時点で

、...

let placeInfo = selectedData[indexPath.row] 
let placeName = placeInfo.objectForKey("Name") as! String 
let placeCity = placeInfo.objectForKey("City") as! String 

しかし、私はテーブルビューを使用していないことから、私が使用するindexPathを持っていません。私の[CKRecord]オブジェクトは、単一のレコードが含まれているので、私はラインが範囲エラー外のインデックスを生成すること

let placeInfo = selectedPlace[0] //also tried 1 

...私は、レコードのアレイ位置でindexPath.rowを置き換えることができると思いました。
私が知っていることをすべて試しましたが、あなたが想像しているように、私はこの時点で、一般的なプログラミングや迅速な開発にはまったく適していません。ここで

は、私が使用していますフルのMapView機能です...

func mapView(mapView: MKMapView, annotationView: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 

    let cloudContainer = CKContainer.defaultContainer() 
    let publicData = cloudContainer.publicCloudDatabase 

    let tappedPlace = annotationView.annotation!.title!! as String 

    let predi = NSPredicate(format: "Name = %@", tappedPlace) 
    let iquery = CKQuery(recordType: "Locations", predicate: predi) 

    publicData.performQuery(iquery, inZoneWithID: nil, completionHandler: { 
     (results, error) -> Void in 

     if error != nil { 
      print(error) 
      return 
     } 

     if let results = results { 
      print("Downloaded data for selected location for \(tappedPlace)") 

      NSOperationQueue.mainQueue().addOperationWithBlock() { 
       self.selectedPlace = results 
      } 
     } 
    }) 

    let placeInfo = selectedPlace[0] 
    let placeName = placeInfo.objectForKey("Name") as! String 
    //returns Index out of range error for placeInfo line 


    //need data before segue 
    //performSegueWithIdentifier("fromMap", sender: self) 
} 

答えて

2

あなたの問題は、それが実際にあなたの完了ハンドラによって署名される前に、selectedPlaceにアクセスしよう、ということです。あなたの 'publicData.performQuery'は非同期操作であると思われます。これは、コンプリートハンドラが実行される前でもコントロールがこの呼び出しから出てくることを意味します(これは非同期呼び出しの場合に必要です)。そしてすぐにその線に到達します。

let placeInfo = selectedPlace[0] 

しかし、データはまだ準備ができておらず、例外があります。今、これはあなたの問題を解決する必要があり、これを解決する場所情報の抽出を移動し、shown-

publicData.performQuery(iquery, inZoneWithID: nil, completionHandler: { 
    (results, error) -> Void in 

    if error != nil { 
     print(error) 
     return 
    } 

    if let results = results { 
     print("Downloaded data for selected location for \(tappedPlace)") 

     NSOperationQueue.mainQueue().addOperationWithBlock() { 
      self.selectedPlace = results 
       if(results.count > 0){ 

       let placeInfo = selectedPlace[0] 
       let placeName = placeInfo.objectForKey("Name") as! String 
       //Do any other computations as needed. 
       performSegueWithIdentifier("fromMap", sender: self) 
      } 
     } 
    } 
}) 

として完了ハンドラ内セグエコードを実行します。

+0

うん、それを修正!本当にありがとう! – ALTVisual

関連する問題