MKMapView nicht delegieren Methoden aufrufen

stimmen
10

In einem UIViewController füge ich eine MKMapView zur Ansicht durch den Controller gesteuert.

- (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 in der Steuerung Ich habe

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

Geschehen wird nie gedruckt. Keiner der anderen Delegatmethoden erhalten entweder wie mapView genannt: viewForAnnotation: Ich habe eine MKMapView in einer anderen App verwenden, aber dies scheint auf jede neue Anwendung passieren ich machen. Hat jemand anderes dieses Verhalten gesehen?

BEARBEITEN:

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 umgehen, immer noch sehr merkwürdig erscheint, da ich es vorher getan haben.

Veröffentlicht am 04/09/2009 um 14:42
quelle vom benutzer
In anderen Sprachen...                            


10 antworten

stimmen
8

Ich hatte genau das gleiche Problem: Ich hatte zugewiesen <MKMapViewDeledate> meinem Controller und verknüpft die Delegierten auf „Datei Besitzer“ im Interface Builder, aber immer noch waren meine umgesetzt Delegatmethoden nicht genannt.

Der Grund dafür ist, dass seit iOS 4, Karten zwischengespeichert werden, und immer dann, wenn eine App eine im Cache gespeicherte Karte angezeigt werden dann Methoden wie „mapViewDidFinishLoadingMap“ wird nicht genannt. Zurücksetzen „Inhalte und Einstellungen“ im Simulator löscht die im Cache gespeicherten Karten und löst somit das Problem.

Beantwortet am 15/01/2011 um 19:06
quelle vom benutzer

stimmen
6

Ein bisschen alt, aber da iOS 7 gibt es eine neue Methode, die funktionieren könnte. mein Problem gelöst

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
Beantwortet am 14/06/2015 um 22:48
quelle vom benutzer

stimmen
4

Vielleicht brauchen Sie von der MKMapView der Ansicht conroller auf die IB und Steuer ziehen zu gehen, dann Delegierten wählen, um es einen Delegierten zu machen ???

Beantwortet am 29/01/2010 um 00:59
quelle vom benutzer

stimmen
1

Ich hatte ein ähnliches Problem mit den Methoden der MKMapViewDelegate nicht genannt zu werden. Mein Problem war die Einstellung die MKCoordinateRegionMakeWithDistance und regionThatFits in der Steuerung -viewDidLoad () Ich wollte nur die Region rund um mein Haus zeigen und nicht mit der Weltsicht zu starten. So, nachdem Anmerkungen in der Steuerung viewDidLoad Zugabe begann ich einen Timer. Wenn es in einer Sekunde abläuft, vergrößern ich auf die Region in I mit den oben genannten APIs und die Delegatmethoden Feuer wollen. Es macht mich nur ein wenig schwindlig und geneigt auf meinem iPad erbrechen.

Jetzt habe ich nur mit den verflixt wenig Speicher Warnungen beschäftigen.

Beantwortet am 21/05/2010 um 16:38
quelle vom benutzer

stimmen
1

vielleicht ganz offensichtlich, aber nur überprüft:

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

@interface YourViewController : UIViewController <MKMapViewDelegate>
Beantwortet am 04/09/2009 um 16:02
quelle vom benutzer

stimmen
0

Mein Problem ist , dass ich vergessen Lage im Simulator zu setzen. Zum Simulator -> Debug -> Location -> Custom location...und die MKMapViewDelegateMethoden werden lostelefonieren

Beantwortet am 04/04/2017 um 09:19
quelle vom benutzer

stimmen
0

Ich hatte ein ähnliches Problem in XCode 6.1 Aufbau für iOS 8.1, wo keine der MKMapViewDelegate Methoden aufgerufen wurden. In einer zweiten Anwendung namens der identische Code in den MKMapViewDelegate Methoden geführt werden, wie erwartet.

In ViewController.m wurde die mapView Delegierten wie folgt festgelegt:

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

In ViewController.h:

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

Ich hatte manuell die IBOutlet Zeile oben auf die Header-Datei, sondern nur in der App, wo die Delegatmethoden nicht empfangen wurden.

Die Lösung war die IBOutlet Zeile zu löschen ich den Header manuell hinzugefügt hatte, und gehen Sie dann auf das Storyboard und CTRL-ziehen von MKMapView zum @interface Block in meinem ViewController.h. Die identische IBOutlet wurde in der Header-Datei mit dem Ergebnis, neu erstellt, dass alle Delegatmethoden richtig genannt wurden.

Beantwortet am 01/03/2015 um 06:55
quelle vom benutzer

stimmen
0

Ich lief dies in wieder auf iOS 7 und herausgefunden etwas, das konsequent funktioniert. Das Problem, das wir normalerweise kämpfen sind ruft setRegion vor der Region Kontext (Ansicht gerendert). IOS 7 fügt neue Delegatmethoden Stellvertretend für alle Fliesen wiedergegeben wird, aber pre-IOS 7 die zwischengespeicherten Fliesen verhindert die Delegatmethode mapViewDidFinishLoadingMap aus aufgerufen wird. Stattdessen ich einen „pendingRegion“ Variable verwenden, um zu überprüfen, wenn ich „Warteschlange“ eine Region ändern für, wenn die Karte wiedergegeben wird und dann einfach die viewDidAppear Methode als Signal verwendet die Karte auf den Bildschirm wiedergegeben worden ist, und daher wird eine Region Kontext hat .

Fügen Sie eine Variable zu Ihrem Header:

MKCoordinateRegion pendingRegion;

Fügen Sie diese Methode, um Ihren Code:

-(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];
}
Beantwortet am 26/09/2013 um 16:26
quelle vom benutzer

stimmen
-1

Für mich war es nach der Zugabe von NSLocationWhenInUseUsageDescriptionString in Info.plist

Beantwortet am 03/05/2015 um 12:12
quelle vom benutzer

stimmen
-2

Ich traf auch gleiche Problem wie Sie. Ich fand, dass: mit dem iPhone SDK 3.2 - wenn ich einen neuen UIViewController mit einer zugehörigen xib-Datei (die Checkbox Option in UIViewController Erstellen Dialog) erstellen, Delegatmethoden von MKMapViewDelegate wird nie genannt.

Allerdings, wenn ich unten Schritte ausgeführt haben, es läuft gut.

  1. Erstellen Sie eine neue UIViewController Klasse (nie überprüfen Sie die Option: create xib Datei mit dem Controller verbunden ist)

  2. Erstellen Sie eine neue Datei xib. Fügen Sie die Karte mit Interface Builder + Den Eigentümer-Klasse mit der Klasse Einstellung auf Stufe 1 + Einstellung Delegatobjekt der Kartenpunkt an den Eigentümer-Klasse.

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

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

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

Der Code läuft ok. Ich weiß nicht, was Apple ändert oder habe mit der xib Datei, wenn ich meine UIViewController mit den Assistenten erstellen, aber es kann die Ursache für mein Problem. Es dauert 1 Tag diese dumme Lösung zu finden.

Wenn Sie ein anderes gefunden, bitte mir teilen.

Vielen Dank

Beantwortet am 02/05/2010 um 11:09
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more