2011-09-01 40 views
6

Tôi có một bộ điều khiển xem với một MKMapView mà các cuộc gọiMKMapView treo ứng dụng khi xem bộ điều khiển popped

[self.mapView setRegion:region animated:YES]; 

mà lại vị trí bản đồ từ A đến B.

Quan điểm điều khiển mà giữ MKMapView được thiết lập như người được ủy quyền và trong số

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

Tôi có một số mã sẽ kích hoạt một setRegion khác: hoạt ảnh: tới MKMapView để bản đồ sẽ tự động phóng to vị trí mới.

Mọi thứ hoạt động tốt nếu tôi popViewControllerAnimated: bộ điều khiển chế độ xem SAU hoạt ảnh MKMapView được thực hiện xoay và thu phóng.

Tuy nhiên, khi tôi cố gắng popViewControllerAnimated: trình điều khiển chế độ xem hiện tại WHILE MKMapView đang chạy hình động, ứng dụng gặp sự cố với "thư được gửi tới phiên bản được phân phối".

Từ giao diện của trình gỡ lỗi, tôi nghĩ rằng MKMapView đang cố gắng gọi một phương thức từ đại biểu được phân phối và phân phối.

Vì vậy, tôi đã cố gắng

[self.mapView setDelegate:nil]; 
self.mapView = nil; 

trong viewDidUnload không có may mắn. Ứng dụng vẫn gặp sự cố nhất quán. Điều duy nhất tôi có thể nghĩ đến là tạo ra một lớp đại biểu mới riêng biệt và giữ lại lớp đó từ bộ điều khiển xem cha để MKMapView sẽ có một đại biểu để gọi ngay cả sau khi bộ điều khiển xem có chứa nó được deallocated.

Tại sao điều này lại xảy ra? Có tùy chọn "sạch" nào khác không?

+0

Điều này thật thú vị. Ứng dụng của chúng tôi đang bị tê liệt bởi các sự cố rắc rối xảy ra khi một MKMapView gọi cho đại biểu để có được chế độ xem cho chú thích. Vấn đề là ở đó không có MKMapView nào tồn tại; hoặc không nên có. Bộ điều khiển có chứa nó từ lâu đã được xuất hiện. Tự hỏi nếu đó là cùng một vấn đề. – Oscar

+1

Dường như cùng một vấn đề như sau: http://stackoverflow.com/questions/2188098/why-am-i-crashing-after-mkmapview-is-freed-if-im-no-longer-using-it – Oscar

Trả lời

14

Một người bạn đã giúp tôi tải ứng dụng này.

Tôi đã triển khai phương pháp riêng của mình để bật trình điều khiển chế độ xem thay vì sử dụng nút quay lại của trình điều khiển điều hướng mặc định. Tôi chỉ cần thêm [self.mapView setDelegate: nil]; trước khi tôi bật trình điều khiển chế độ xem.

- (void)goBack 
{ 
    [self.mapView setDelegate:nil]; 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+3

Nó không thể làm điều này trong viewWillDisappear? – Oscar

+0

+100 Nó giúp tôi tiết kiệm rất nhiều thời gian! – Tomasz

+0

Insanely Apple. – jowie

8

OK, đây là câu trả lời thực sự. Đó là từ tài liệu của Apple, nhưng nó thiếu từ MKMapView. Nó chỉ được tìm thấy trong tài liệu cho giao thức đại biểu của nó:

"Trước khi phát hành một đối tượng MKMapView mà bạn đã thiết lập một đại biểu, hãy nhớ đặt thuộc tính ủy nhiệm của đối tượng đó thành không. Một nơi bạn có thể làm điều này là trong phương thức dealloc nơi bạn vứt bỏ chế độ xem bản đồ. "

LƯU Ý: Điều này cũng áp dụng cho UIWebView.

Tôi đặt con trỏ ủy nhiệm của MapView thành 0 trong phương thức dealloc của đại biểu và các sự cố của chúng tôi dường như đã bị loại bỏ.

+0

Điều này áp dụng cho đối tượng _any_ có thể tồn tại lâu hơn đại biểu của nó. –

-1

Các mã sau đây có thể sẽ asolve vấn đề của bạn:

-(void) viewWillDisappear:(BOOL)animated 
{ 
    self.mapView.delegate = nil; 
    mapView=Nil; 
    NSLog(@"viewWillDisappear"); 

} 
+0

Bạn quên gọi phương thức siêu xemWillDisappear: hoạt ảnh – Neru

0

Vấn đề của tôi đã không được giải quyết bằng cách thiết lập đại biểu của MKMapView để nil trong điều khiển điểm của tôi

[self.mapView setDelegate: nil ];

Tôi phải tạo tham chiếu __strong của UIViewController chứa MKMapView trong RootViewController của tôi.

__strong < # UIViewController #> * vcNewLocation;

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