2011-08-26 33 views
12

Tôi đang thử tải khu vực bản đồ và các phương thức ủy quyền của MKMapView không được gọi vào lần tải thứ hai hoặc sau đó. Không có phương thức nào của đại biểu vizLàm thế nào để xóa bộ nhớ đệm MKMapView?

- (void)mapViewWillStartLoadingMap:(MKMapView *)mapView; 
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView; 
- (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error; 

chưa bao giờ được gọi. Phương thức Chỉ được gọi là

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated; 
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated; 

Dường như ios4 đang lưu vào bộ đệm hình ảnh bản đồ.

Tôi đã tìm thấy các dòng này trong tài liệu Tham khảo giao thức MKMapViewDelegate. Dòng nổi bật là vấn đề của tôi.

Phương thức này được gọi khi lát bản đồ được liên kết với yêu cầu hiện tại đã được tải. Gạch bản đồ được yêu cầu khi một khu vực hiển thị mới được cuộn vào chế độ xem và các lát gạch chưa có sẵn. Gạch bản đồ cũng có thể được yêu cầu cho các phần của bản đồ hiện không hiển thị. Ví dụ: chế độ xem bản đồ có thể tải các ô xếp ngay lập tức xung quanh khu vực hiển thị hiện tại khi cần thiết để xử lý các chảo nhỏ của người dùng.

Tôi cần thực hiện một số thao tác nhất định sau khi bản đồ được tải nhưng vì không có phương pháp đại biểu nào được đề cập ở trên được gọi là Tôi không thể thực hiện chức năng mong muốn. Bất cứ ai có thể đề nghị một sửa chữa để xóa bộ nhớ cache hoặc cung cấp một giải pháp thay thế cho điều này? Tôi đã thử sử dụng các phương pháp được mô tả herethis nhưng tôi vẫn không thể làm cho mã hoạt động.

+0

Chính xác thì bạn đang cố gắng đạt được gì khi sử dụng các phương pháp đại biểu đó? – AlexB

+0

Tôi cần một màn hình lấy bản đồ trong didFinishLoadingMap, và phương pháp đại biểu này chỉ được gọi là một lần, sau khi bộ nhớ đệm gạch nó không phải là cuộc gọi didfinish cũng không đại biểu failLoad. Tôi nên làm gì bây giờ? –

+0

Tôi đã gửi Apple Bug # 13774496 liên quan đến vấn đề này và tạo một ứng dụng mẫu để hiển thị sự cố vẫn tồn tại trên iOS6: https://github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed

Trả lời

3

Tôi nghĩ rằng bạn có thể vài willStartLoadingMap, didFinishLoadingMapregionDidChange, như thế này:

  • trong willStartLoadingMap thiết lập một lá cờ loading true;
  • trong didFinishLoadingMap đặt tải flag thành sai và cũng kiểm tra xem bạn có cuộc gọi hàng đợi cho phương thức chụp màn hình hay không. Nếu có, hãy gọi nó;
  • trong regionDidChange kiểm tra cờ loading và nếu được đặt thành false, hãy gọi phương thức chụp màn hình. Nếu không, hãy xếp hàng để nó được thực hiện khi bản đồ kết thúc tải.

Bằng cách này bạn chắc chắn rằng bạn chụp màn hình sau khi các ô xếp đã được tải.

Tuy nhiên, khu vựcDidChange có thể được gọi nhiều lần, vì vậy hãy đảm bảo bạn chỉ lấy màn hình khi chế độ xem bản đồ thay đổi đáng kể (bạn có thể so sánh khu vực/trung tâm bản đồ trước đó và khu vực/trung tâm bản đồ hiện tại).

+0

Cảm ơn bạn alexb. Tôi đã thêm một bản vá nhỏ cùng với các bước bạn đã đề xuất và nó đã thực hiện thủ thuật. –

+0

Thao tác này không hoạt động đối với trường hợp bạn đã mất kết nối internet để không thể tải thêm ô xếp. Nó vẫn gọi các đại biểu nói rằng bản đồ đã được nạp đầy đủ. Có vẻ như một lỗi trên phần của Apple. – iwasrobbed

2

Tôi đã tạo một dự án mới và kết nối đại biểu với bộ điều khiển chế độ xem của tôi. Hai phương pháp đầu tiên của ba câu hỏi được gọi. Vì nó tải tất cả các gạch, phương thức ủy nhiệm lỗi không được gọi.

Tôi vừa mới đi vào các vấn đề tương tự. Tôi đã phân lớp MKMapView và quên đặt đại biểu trong các phương thức init tùy chỉnh của tôi và trong awakeFromNib:. Có lẽ đó là những gì gây ra vấn đề của bạn, quá.

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