2017-11-09 17 views
2

ボタンがタップされたときにデータを渡す最善の方法を考え出すのに問題があります。私はまた、それがタップされたときにボタンをアニメーション化したい。このボタンは、マップアノテーションのカスタムコールアウトビューの内側にあります。私は、クラスのプロパティdogIDOfUpvoteTappedを設定し、それを使用して、呼び出された関数がアクセスできるようにデータを格納しようとしました。残念ながら、ボタン自体とやりとりしたいときは、状況が複雑になります。#selector関数でデータを渡す

呼び出された関数 'upvoteButtonTapped'から 'CustomAnnotation'オブジェクトへの参照を取得するにはどうすればよいですか?私は無関係なコードの束を省略しますが、ここで私が働いているものです:

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) { 
    if view.annotation is MKUserLocation { 
     return 
    } 

    let customAnnotation = view.annotation as! CustomAnnotation 
    let views = Bundle.main.loadNibNamed("CustomCalloutView", owner: nil, options: nil) 
    let calloutView = views?[0] as! CustomCalloutView 

    dogIDOfUpvoteTapped = customAnnotation.dogID 

    calloutView.scoreLabel.text = text 
    calloutView.creatorLabel.text = customAnnotation.creator 
    calloutView.dogImageView.image = customAnnotation.picture 
    calloutView.upvoteButton.addTarget(self, action: #selector(upvoteTapped), for: .touchUpInside) 

    view.addSubview(calloutView) 
} 

私がやっているものは何も質問には本当に関連していないのにここで、upvoteTappedするための機能です。

@objc func upvoteTapped() { 
    let ref = Database.database().reference().child("dogs").child(dogIDOfUpvoteTapped) 
    ref.child("upvotes").observeSingleEvent(of: .value, with: { (snap) in 
     var currentUpvotes = Int(snap.value as! String)! 
     currentUpvotes += 1 
     ref.child("upvotes").setValue(String(currentUpvotes)) 
    }) 

} 
+0

ボタンにパラメータを追加することはできませんが、ビューコントローラにプロパティを追加し、希望する値を追加してIBActionからアクセスしてください。 –

+0

@LeoDabus上記を参照すると、現在これを行っています。アクションからそのボタンを参照していないときに、どのようにボタンのアニメーションを作成するのですか? –

+0

申し訳ありませんが、上のコードではView Controllerインスタンスのプロパティは表示されません。 –

答えて

0

@ leo-dabusあなたは送信者(ボタン)でメソッドの変形を使用する必要があります。

さらに、そのボタンにタグを付けてセットで識別してください.NBは整数でなければなりません。データベースアイテム(dogID)のリストの整数IDまたはインデックスを使用しているか、 )。

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) { 
    if view.annotation is MKUserLocation { 
     return 
    } 

    let customAnnotation = view.annotation as! CustomAnnotation 
    let views = Bundle.main.loadNibNamed("CustomCalloutView", owner: nil, options: nil) 
    let calloutView = views?[0] as! CustomCalloutView 

    dogIDOfUpvoteTapped = customAnnotation.dogID 

    calloutView.scoreLabel.text = text 
    calloutView.creatorLabel.text = customAnnotation.creator 
    calloutView.dogImageView.image = customAnnotation.picture 
    calloutView.upvoteButton.tag = dogIDOfUpvoteTapped 
    calloutView.upvoteButton.addTarget(self, action: #selector(upvoteTapped:), for: .touchUpInside) 

    view.addSubview(calloutView) 
} 

@objc func upvoteTapped(_ button: UIButton) { 
    let ref = Database.database().reference().child("dogs").child(button.tag) 
    ref.child("upvotes").observeSingleEvent(of: .value, with: { (snap) in 
     var currentUpvotes = Int(snap.value as! String)! 
     currentUpvotes += 1 
     ref.child("upvotes").setValue(String(currentUpvotes)) 
    }) 

} 

customAnnotation.dogIDのクラスを見なければ、私はその文字列または他のは、あなたがint型で主キーまたはインデックスを使用する必要があるならば、それは、整数であると想定しています。プライマリキーがintであることは間違いありません。

関連する問題