2016-04-08 6 views
2

1) Ich habe die Viewcontroller mit dem MapKitWie das Klicken auf die Schaltfläche in der Nachspiel XIB Ansicht (Anmerkung)

1.1) ich einige stecknadel

class ViewController: UIViewController, MKMapViewDelegate 

2) I Karte hinzugefügt haben, fangen die neuen Klassen für benutzerdefinierte Stift Callout und Annotation schreiben

class CustomPointAnnotation: MKPointAnnotation { 

class CustomCalloutView: UIView { 

3) I .xib für meinen benutzerdefinierten Stift callout enter image description here

erstellt haved

4) habe ich den Knopf in meinem .xib, diese Taste muss etwas tun, zum Beispiel

@IBAction func clickTest(sender: AnyObject) { 
    print("aaaaa") 
} 

5) Diese Taste nicht

funktioniert

Was in der Regel für diese Praxis? Ich möchte, dass mein Button funktioniert. Taste ist blau: enter image description here

Alle Projekt, das Sie auf Github sehen: https://github.com/genFollowMe1/forStack Danke, sorry für Englisch)

Antwort

2

für Objective C: https://github.com/nfarina/calloutview

aktualisieren

für eine schnelle

Unterklasse der MKAnnotationView für cu Rufen Sie die Methoden hitTest: und pointInside: auf und überschreiben Sie sie.

import UIKit 
import MapKit 

class CustomCalloutView: MKAnnotationView { 

@IBOutlet weak var name: UILabel! 

@IBAction func goButton(sender: AnyObject) { 

    print("button clicked sucessfully") 
} 

override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
    let hitView = super.hitTest(point, withEvent: event) 
    if hitView != nil { 
     superview?.bringSubviewToFront(self) 
    } 
    return hitView 
} 

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { 
    let rect = self.bounds 
    var isInside = CGRectContainsPoint(rect, point) 
    if !isInside { 
     for view in subviews { 
      isInside = CGRectContainsPoint(view.frame, point) 
      if isInside { 
       break 
      } 
     } 
    } 
    return isInside 
} 
} 
+0

Entschuldigung, Ihre Lösung ist in Objective-C, ich benutze Swift. Ich habe benutzerdefinierte Callouts und ich kann Variablen an meine .xib senden, aber kann nicht arbeiten Schaltfläche .. '// init XIB' ' Lassen Sie CustomView = (NSBundle.mainBundle().loadNibNamed ("ViewCallout", Besitzer: self, Optionen: nil)) [0] as! CustomCalloutView; ' ' lass calloutViewFrame = customView.frame; ' ' lass cpa = view.annotation as! CustomPointAnnotation' 'cpa.name = "Firmenname"' ' customView.name.text = cpa.name' ' view.addSubview (Custom) ' – GenRiH

+0

Sie haben MKAnnotationView für die customcalloutview Unterklasse (jetzt Ihre Subklassen von UIView) Fügen Sie die Ansicht, Schaltflächen und Beschriftungen in dieser Unterklasse hinzu und überschreiben Sie die Methoden hitTest: und pointInside: um den Klick auf die Schaltfläche zu erreichen. – Jeyamahesan

+0

Sie haben Recht, ich fühle, dass es richtig ist. Sag mir nicht, wo man für diese überlagerte Methode Handbuch zu sehen? (hitTest und pointInside) – GenRiH

0

Die Art und Weise Sie tun müssen, es ist eine Referenz der Button aus .xib zu machen in die zugehörige .swift-Datei.

In Ihrem Viewcontroller tun Sie etwas wie folgt aus:

let button:UIButton! 

[...] 

button.targetForAction("tappedButton:", withSender: self) 

func tappedButton() { 
    print("Taped !") 
} 
+0

Vielen Dank, ich über dem gemacht, was Sie gesagt haben, aber den Fehler: http://i.imgur.com/G1cD3Hz.png – GenRiH

+0

Leider mein schlecht. Sie müssen Ihre XIB-Datei als SubView laden. Hier klicken: https://StackOverflow.com/questions/24857986/load-a-uiview-from-nib-in-swift#26326006 und von hier aus, wenn 'subView' ist der Name Ihrer geladenen XIB-Datei. 'subView.button.targetForAction ...' – Ragnar

+0

Ja, ich habe geladen: 'code' lassen customView = (NSBundle.mainBundle(). LoadNibNamed (" ViewCallout ", Besitzer: self, Optionen: nil)) [0] wie! CustomCalloutView; 'code' Aber ich kann nicht verstehen, können Sie bitte mein Projekt auf Github aussehen? calloutViewFrame = customView.frame; – GenRiH