2009-09-04 39 views
10

Trong UIViewController, tôi thêm một MKMapView vào khung nhìn được điều khiển bởi bộ điều khiển.MKMapView không gọi các phương thức ủy nhiệm

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

Sau đó trong bộ điều khiển Tôi có

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

Xong chưa bao giờ được in. Không có phương thức nào khác được gọi là mapView: viewForAnnotation: Tôi sử dụng một MKMapView trong một ứng dụng khác, nhưng điều này dường như xảy ra trên bất kỳ ứng dụng mới nào mà tôi tạo ra. Có ai khác nhìn thấy hành vi này không?

EDIT:

Vấn đề có vẻ là khi UIViewController được làm đại biểu của MKMapView, một lớp con trực tiếp của NSObject dường như làm việc được. Tôi có thể làm việc xung quanh như thế này, vẫn có vẻ rất kỳ lạ kể từ khi tôi đã làm nó trước đây.

Trả lời

1

có thể khá rõ ràng, nhưng chỉ cần kiểm tra:

Bạn đã chắc chắn rằng khai báo trình điều khiển chế độ xem của bạn đã được thực hiện đúng chưa. Cái gì như:

@interface YourViewController : UIViewController <MKMapViewDelegate> 
+1

Thực tế là tôi có. Tôi tự hỏi nếu nó có bất cứ điều gì để làm với cách mới XCode 3.2 và SDK làm việc cùng nhau. Đây là Mapkit đầu tiên tôi đã thử bắt đầu từ khi 10.6 ra mắt. – criscokid

4

Có lẽ bạn cần phải đi đến các IB và kiểm soát kéo từ MKMapView đến xem conroller, sau đó chọn đại biểu để làm cho nó một delegate ???

+0

Đây là giải pháp đúng. Tôi là mapview phải biết ai là đại biểu của nó. – DexterW

+6

Không có giải pháp nào cả, chỉ là một cách khác để hoàn thành cùng một điều. Chế độ xem bản đồ được cho biết người được ủy quyền của nó nằm trong dòng map.delegate = self; Kiểm soát-kéo trong IB, là tương đương trực quan của lập trình thiết lập các đại biểu. –

-2

Tôi cũng gặp vấn đề tương tự như của bạn. Tôi thấy rằng: với iPhone SDK 3.2 - khi tôi tạo ra một UIViewController mới với một tập tin xib liên quan (tùy chọn hộp kiểm trong hộp thoại tạo UIViewController), phương pháp đại biểu của MKMapViewDelegate không bao giờ được gọi.

Tuy nhiên, khi tôi làm theo các bước dưới đây, nó chạy tốt.

  1. Tạo một lớp UIViewController mới (không bao giờ kiểm tra tùy chọn: tạo file xib kết hợp với bộ điều khiển)

  2. Tạo một file xib mới. Thêm bản đồ bằng cách sử dụng Interface Builder + thiết lập lớp Chủ sở hữu với lớp trên bước 1 + thiết lập đối tượng đại biểu của điểm bản đồ đến lớp chủ sở hữu.

  3. Thực hiện phương pháp đại biểu cho lớp UIViewController ở bước 1.

  4. Khi tôi muốn sử dụng ViewController của tôi (với bản đồ bổ sung), tôi tải nó với tên nib như sau Ví dụ:

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

Mã chạy ok. Tôi không biết những gì Apple thay đổi hoặc đã làm với các tập tin xib khi tôi tạo UIViewController của tôi bằng cách sử dụng thuật sĩ, nhưng nó có thể là nguyên nhân gốc rễ của vấn đề của tôi. Tôi mất 1 ngày để tìm ra giải pháp ngu ngốc này.

Nếu bạn tìm thấy số khác, vui lòng chia sẻ với tôi.

Cảm ơn

+0

Đó là loại hacky ... tại sao không phải là đại biểu được gọi là? – DexterW

1

Tôi đã gặp sự cố tương tự với các phương thức của MKMapViewDelegate không được gọi. Vấn đề của tôi là thiết lập MKCoordinateRegionMakeWithDistance và regionThatFits trong bộ điều khiển -viewDidLoad() Tôi muốn chỉ hiển thị khu vực xung quanh nhà của tôi và không bắt đầu với thế giới.Vì vậy, sau khi thêm chú thích trong viewDidLoad của bộ điều khiển, tôi đã bắt đầu hẹn giờ. Khi nó hết hạn sau một giây, tôi phóng to vùng tôi muốn với các API ở trên và các phương thức ủy nhiệm sẽ kích hoạt. Nó chỉ khiến tôi hơi chóng mặt và có khuynh hướng nôn mửa trên iPad của tôi.

Bây giờ tôi chỉ phải đối phó với cảnh báo bộ nhớ thấp darn.

8

Tôi gặp vấn đề tương tự: Tôi đã gán < MKMapViewDeledate> cho bộ điều khiển của mình và liên kết đại biểu với "Chủ sở hữu tệp" trong Trình tạo giao diện, nhưng vẫn chưa gọi phương thức đại biểu được triển khai của tôi.

Lý do là vì iOS 4, bản đồ được lưu trong bộ nhớ cache và bất cứ khi nào ứng dụng hiển thị bản đồ được lưu trong bộ nhớ cache thì các phương thức như "mapViewDidFinishLoadingMap" không được gọi. Đặt lại "nội dung và cài đặt" trong trình mô phỏng sẽ xóa các bản đồ được lưu trong bộ nhớ cache và do đó giải quyết được vấn đề.

+1

Chỉ cần đặt lại "nội dung và cài đặt" của tôi trên thiết bị của tôi và đảm bảo đủ các phương thức đó đã được gọi trong lần chạy đầu tiên. Nhưng không may mắn trong lần chạy thứ hai! – Mac

+2

Hm, có vẻ 'mapViewDidFinishLoadingMap: mapView' không phải là rất hữu ích sau đó. –

0

Tôi chỉ chạy lại vào ứng dụng này trên iOS 7 và tìm ra điều gì đó hoạt động ổn định. Vấn đề chúng tôi thường chiến đấu là gọi setRegion trước khi khu vực có ngữ cảnh (chế độ xem được hiển thị). iOS 7 bổ sung các phương thức đại diện mới đại diện cho tất cả các ô được hiển thị nhưng trước khi iOS 7 các ô được lưu trong bộ nhớ cache ngăn cản phương thức ủy nhiệm mapViewDidFinishLoadingMap khỏi bị gọi. Thay vào đó, tôi sử dụng biến "pendingRegion" để kiểm tra xem tôi có "xếp hàng" thay đổi vùng khi bản đồ được hiển thị hay không và sau đó chỉ cần sử dụng phương thức viewDidAppear làm tín hiệu bản đồ đã được hiển thị trên màn hình và do đó một khu vực sẽ có ngữ cảnh .

Thêm một biến để tiêu đề của bạn:

MKCoordinateRegion pendingRegion; 

Thêm phương pháp này để mã của bạn:

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

Thêm phần này vào viewDidAppear của bạn:

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

Tôi đã có một vấn đề tương tự trong XCode 6.1 xây dựng cho iOS 8.1, nơi không có phương thức MKMapViewDelegate nào được gọi. Trong một ứng dụng thứ 2, mã giống hệt nhau dẫn đến các phương thức MKMapViewDelegate được gọi như mong đợi.

Trong ViewController.m các đại biểu MapView được thành lập như sau:

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

Trong ViewController.h:

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

tôi đã tự thêm vào dòng IBOutlet trên để các tập tin tiêu đề, nhưng chỉ trong ứng dụng không nhận được phương thức đại biểu.

Giải pháp là xóa dòng IBOutlet mà tôi đã thêm thủ công vào tiêu đề và sau đó chuyển đến bảng phân cảnh và CTRL-kéo từ MKMapView tới khối @interface trong ViewController.h của tôi. IBOutlet giống hệt nhau được tạo lại trong tệp tiêu đề với kết quả là tất cả các phương thức đại biểu được gọi chính xác.

-1

Đối với tôi, nó làm việc sau khi thêm NSLocationWhenInUseUsageDescription chuỗi trong Info.plist

6

Một chút cũ, nhưng kể từ khi iOS 7 có một phương pháp mới có thể làm việc. đã giải quyết được sự cố của tôi

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

Lifesaver - cảm ơn! Trong ứng dụng của tôi, tôi có nhiều bản đồ và 'mapViewDidFinishLoadingMap' được gọi khi bản đồ đầu tiên được tải nhưng không được gọi khi bản đồ thứ hai được tải. Tuy nhiên, 'mapViewDidFinishRenderingMap' được gọi mỗi khi mỗi bản đồ được hiển thị. Câu trả lời hoàn hảo, cảm ơn! – nurider

0

Vấn đề của tôi là tôi quên đặt vị trí trong trình mô phỏng.Chuyển đến Simulator -> Debug -> Location -> Custom location... và các phương pháp MKMapViewDelegate sẽ bắt đầu gọi

Các vấn đề liên quan