2009-09-04 12 views
10

In einem UIViewController füge ich eine MKMapView zu der Ansicht hinzu, die vom Controller gesteuert wird.MKMapView ruft keine Delegiertenmethoden auf

- (void)viewDidLoad { 
[super viewDidLoad]; 
CGRect rect = CGRectMake(0, 0, 460, 320); 
map = [[MKMapView alloc] initWithFrame:rect]; 
map.delegate = self; 
[self.view addSubview:map]; 
} 

Später im Controller habe ich

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView 
{ 
    NSLog(@"done."); 
} 

erledigt wird nie gedruckt. Keine der anderen Delegate-Methoden wird wie mapView aufgerufen: viewForAnnotation: Ich verwende eine MKMapView in einer anderen App, aber das scheint bei jeder neuen Anwendung zu passieren. Hat jemand anderes dieses Verhalten gesehen?

EDIT:

Das Problem scheint zu sein, wenn UIViewController die Delegierten des MKMapView gemacht wird, scheint eine direkte Unterklasse von NSObject in Ordnung zu arbeiten. Ich kann so herumarbeiten, scheint immer noch sehr merkwürdig, seit ich es vorher getan habe.

Antwort

1

vielleicht ganz offensichtlich, aber nur Überprüfung:

Haben Sie sorgten dafür, dass Ihre Viewcontroller Erklärung richtig gemacht. Etwas wie:

@interface YourViewController : UIViewController <MKMapViewDelegate> 
+1

In der Tat habe ich. Ich frage mich, ob es etwas mit der neuen Art zu tun hat, wie XCode 3.2 und das SDK zusammenarbeiten. Dies ist das erste Mapkit, das ich seit 10.6 ausprobiert habe. – criscokid

4

Vielleicht müssen Sie von der MKMapView der Ansicht conroller auf die IB und Steuertaste gehen, dann wählen Sie delegieren es ein Delegierter zu machen ???

+0

Dies ist die richtige Lösung. Ich war der Mapview muss wissen, wer sein Delegierter ist. – DexterW

+6

Es ist überhaupt keine Lösung, nur eine andere Art, dasselbe zu erreichen. Der Kartenansicht wird mitgeteilt, wer sich in der Zeile map.delegate = self befindet; Das Ziehen von Steuerelementen in IB ist das visuelle Äquivalent zum programmatischen Festlegen des Delegaten. –

-2

Ich traf auch das gleiche Problem wie Ihres. Ich habe festgestellt, dass: mit dem iPhone SDK 3.2 - wenn ich einen neuen UIViewController mit einer assoziierten XIB-Datei (die Checkbox-Option in UIViewController Erstellen von Dialog) erstellen, Delegate Methoden von MKMapViewDelegate nie aufgerufen werden.

Wenn ich jedoch die folgenden Schritte befolge, läuft es gut.

  1. Erstellen Sie eine neue UIViewController Klasse (nie die Option: xib Datei, die mit dem Controller erstellen)

  2. Erstellen Sie eine neue Datei xib. Fügen Sie die Zuordnung mithilfe von Interface Builder + zum Festlegen der Owner-Klasse mit der Klasse in Schritt 1 hinzu, und legen Sie das Delegate-Objekt des Kartenpunkts auf die Owner-Klasse fest.

  3. Implementieren Delegatmethoden für die UIViewController Klasse in Schritt 1

  4. Wenn ich meine Viewcontroller verwenden möchten (mit der zusätzlichen Karte), ich es mit der Spitze Namen laden, wie unter Beispiel:

    MapPreviewController* mapPreviewController = [[MapPreviewController alloc] 
        initWithNibName:@"MapPreviewController" bundle:[NSBundle mainBundle]]; 
    
    [self.centerPanelView addSubview:mapPreviewController.view]; 
    

Der Code läuft in Ordnung. Ich weiß nicht, was Apple mit der XIB-Datei ändert oder getan hat, wenn ich meinen UIViewController mithilfe des Assistenten erstelle, aber das ist möglicherweise die Ursache meines Problems. Ich brauche einen Tag, um diese dumme Lösung zu finden.

Wenn Sie ein anderes gefunden haben, bitte teilen Sie mir.

Dank

+0

Das ist eine Art Hacky ... warum wird der Delegierte nicht genannt? – DexterW

1

Ich hatte ein ähnliches Problem mit den Methoden der MKMapViewDelegate nicht genannt zu werden. Mein Problem war das Setzen der MKCoordinateRegionMakeWithDistance und regionThatFits im Controller -viewDidLoad() Ich wollte nur die Region um mein Haus zeigen und nicht mit der Weltansicht beginnen.Nach dem Hinzufügen von Anmerkungen in der ViewDidLoad des Controllers habe ich einen Timer gestartet. Wenn es in einer Sekunde abläuft, zoome ich mit den obigen APIs die gewünschte Region heran und die Delegate-Methoden werden ausgelöst. Es macht mich nur ein bisschen schwindlig und neigt dazu, auf meinem iPad zu erbrechen.

Jetzt muss ich nur mit den verflixten Warnungen des niedrigen Gedächtnisses beschäftigen.

8

Ich hatte genau das gleiche Problem: Ich hatte < MKMapViewDeledate> zu meinem Controller zugewiesen und den Delegaten mit "File owner" in Interface Builder verknüpft, aber meine implementierten Delegate-Methoden wurden nicht aufgerufen.

Der Grund ist, dass seit iOS 4 Karten zwischengespeichert werden und wenn eine Anwendung eine im Cache gespeicherte Karte anzeigt, werden Methoden wie "mapViewDidFinishLoadingMap" nicht aufgerufen. Das Zurücksetzen von "Inhalten und Einstellungen" im Simulator löscht die zwischengespeicherten Karten und löst das Problem.

+1

Setzen Sie einfach meine "Inhalte und Einstellungen" auf meinem Gerät zurück und sicher, dass diese Methoden im ersten Lauf aufgerufen wurden. Aber kein Glück im zweiten Anlauf! – Mac

+2

Hm, scheint 'mapViewDidFinishLoadingMap: mapView' ist dann nicht sehr nützlich. –

0

Ich bin gerade auf iOS 7 wieder reingekommen und habe herausgefunden, dass etwas funktioniert. Das Problem, mit dem wir normalerweise zu kämpfen haben, ruft setRegion auf, bevor die Region einen Kontext hat (Ansicht gerendert). iOS 7 fügt neue Delegate-Methoden hinzu, die alle gerenderten Kacheln darstellen, aber vor dem iOS 7 verhindern die zwischengespeicherten Kacheln, dass die Delegate-Methode mapViewDidFinishLoadingMap aufgerufen wird. Stattdessen verwende ich eine Variable "pendingRegion", um zu überprüfen, ob ich eine Regionswechsel für das Rendern der Map "in die Warteschlange gestellt" habe und dann einfach die viewDidAppear-Methode als Signal für die Darstellung der Map auf dem Bildschirm verwende .

Fügen Sie eine Variable zu Ihrem Header:

MKCoordinateRegion pendingRegion; 

diese Methode, um Ihren Code hinzufügen:

-(void)initPendingRegion { 
    pendingRegion.center = CLLocationCoordinate2DMake(0.0, 0.0); 
} 

Fügen Sie diese auf Ihre viewDidAppear:

if(pendingRegion.center.latitude != 0.0) { 
     MKCoordinateRegion useRegion = pendingRegion; 
     [self initPendingRegion]; 
     [self.mapView setRegion:useRegion animated:YES]; 
} 
0

hatte ich ein ähnliches Problem in XCode 6.1 für iOS 8.1, wo keine der MKMapViewDelegate-Methoden aufgerufen wurde. In einer zweiten Anwendung führte der identische Code dazu, dass die MKMapViewDelegate-Methoden wie erwartet aufgerufen wurden.

In ViewController.m die mapView Delegierten wurden wie folgt eingestellt:

- (void)viewDidLoad { 
    ... 
    self.mapView.delegate = self; 

In ViewController.h:

@interface myMapViewController : UIViewController <MKMapViewDelegate> 
@property (strong, nonatomic) IBOutlet MKMapView *mapView; 
@end 

ich oben auf die Header-Datei, die IBOutlet Linie manuell hinzugefügt hatte, aber nur in der App, in der die Delegiertenmethoden nicht empfangen wurden.

Die Lösung bestand darin, die manuell hinzugefügte IBOutlet-Zeile in der Kopfzeile zu löschen, dann zum Storyboard zu gehen und mit der STRG-Taste von MKMapView zum @interface-Block in meiner ViewController.h zu ziehen. Das identische IBOutlet wurde in der Header-Datei neu erstellt mit dem Ergebnis, dass alle Delegate-Methoden korrekt aufgerufen wurden.

-1

Für mich ist es arbeitete nach NSLocationWhenInUseUsageDescription Zeichenfolge in Info.plist

6

Ein bisschen alt, aber da iOS 7 gibt es eine neue Methode hinzufügen, die funktionieren könnte. löste mein Problem

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered 
+0

Lebensretter - danke! In meiner App habe ich mehrere Karten und 'mapViewDidFinishLoadingMap' wird aufgerufen, wenn die erste Karte geladen, aber nicht aufgerufen wird, wenn die zweite Karte geladen wird. 'MapViewDidFinishRenderingMap' wird jedoch jedes Mal aufgerufen, wenn jede Karte gerendert wird. Perfekte Antwort, danke! – nurider

0

Mein Problem ist, dass ich vergessen Ort im Simulator zu setzen.Gehen Sie zu Simulator -> Debug -> Location -> Custom location... und die MKMapViewDelegate Methoden beginnen zu rufen