2012-03-02 45 views
6

Tôi có chế độ xem bản đồ có chú thích và các chú thích này hiển thị chú dẫn. Khi nút chi tiết tiết lộ của chú thích được nhấp, nó sẽ phân tách thành một chế độ xem mới.Chú thích thay đổi/mất thứ tự MKMapView?

MKAnnotations của tôi là lớp tùy chỉnh triển khai <MKAnnotation>. Hãy gọi đó là lớp MyClass. Chúng được lưu trữ trong một NSMutableArray. Trong chế độ xem của chế độ xem này, tôi thêm từng đối tượng của MyClass vào mảng này vào chú thích của chế độ xem bản đồ. Sử dụng trình gỡ lỗi, tôi có thể thấy rằng một khi tất cả việc thêm này được thực hiện, thứ tự [self.MapView annotations] giống với NSMutableArray.

Bây giờ tôi đặt một điểm ngắt khác trong mapView: viewForAnnotation: và kiểm tra thứ tự 1) NSMutableArray của tôi và 2) [self.MapView annotations]. Các mảng là tất nhiên trong cùng một thứ tự. Tuy nhiên, thứ tự của các chú thích đã được tranh giành.

Đây là một vấn đề lớn đối với tôi, vì tôi cần sử dụng trường hợp cụ thể của MyClass mà người dùng đã chọn trong chế độ xem tiếp theo. AKA, tôi muốn xem chú thích, tìm chỉ mục của nó, và sau đó sử dụng nó để lấy cùng một chỉ mục trong mảng.

Tôi hiện đã nhận ra rằng tôi chỉ có thể lưu trực tiếp chú thích (đến từ nền Android, điều này rất tuyệt với tôi). Tuy nhiên, tôi vẫn còn suy nghĩ một cách khái niệm về lý do tại sao thứ tự trở nên tranh giành. Ai đó có thể giúp tôi? Mã bên dưới:

- (void)viewDidLoad 
{ 


    if([fromString isEqualToString:@"FromList"]) 
     self.navigationItem.hidesBackButton = TRUE; 
    else { 
     self.navigationItem.rightBarButtonItem = nil; 
    } 


    self.array = [MySingleton getArray]; 
    //set up map 

    //declare latitude and longitude of map center 
    CLLocationCoordinate2D center; 
    center.latitude = 45; 
    center.longitude = 45; 

    //declare span of map (height and width in degrees) 
    MKCoordinateSpan span; 
    span.latitudeDelta = .4; 
    span.longitudeDelta = .4; 

    //add center and span to a region, 
    //adjust the region to fit in the mapview 
    //and assign to mapview region 
    MKCoordinateRegion region; 
    region.center = center; 
    region.span = span; 
    MapView.region = [MapView regionThatFits:region]; 

    for(MyClass *t in self.array){ 
     [MapView addAnnotation:t]; 
    } 
    [super viewDidLoad]; 
} 



//this is the required method implementation for MKMapView annotations 
- (MKAnnotationView *) mapView:(MKMapView *)thisMapView 
      viewForAnnotation:(MyClass *)annotation 
{ 


    static NSString *identifier = @"MyIdentifier"; 

    //the result of the call is being cast (MKPinAnnotationView *) to the correct 
    //view class or else the compiler complains 
    MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[thisMapView 
                    dequeueReusableAnnotationViewWithIdentifier:identifier]; 
    if(annotationView == nil) 
    { 
     annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; 
    } 

    annotationView.pinColor = MKPinAnnotationColorGreen; 

    //pin drops when it first appears 
    annotationView.animatesDrop=TRUE; 

    //tapping the pin produces a gray box which shows title and subtitle 
    annotationView.canShowCallout = YES; 

    UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    annotationView.rightCalloutAccessoryView = infoButton; 


    return annotationView; 
} 

Trả lời

6

Khi bạn gọi addAnnotation hoặc addAnnotations, giao diện bản đồ bổ sung thêm tài liệu tham khảo (s) vào danh sách nội bộ của mình các chú thích.

Thuộc tính annotations của MKMapView chỉ cần trả về danh sách nội bộ này (bất kể loại nào có thể) là NSArray.

Tôi không biết bất kỳ vị trí nào trong tài liệu nơi nó tuyên bố rằng thuộc tính annotations trả về mảng theo thứ tự mà bạn đã thêm chú thích. Nếu bạn đã bật showsUserLocation, mảng sẽ bao gồm chú thích đó ngay cả mặc dù bạn đã không thêm nó một cách rõ ràng.

Bạn không cần phải quan tâm về bạn cũng không nên phụ thuộc vào thứ tự của các đối tượng trong thuộc tính annotations.

Chỉ cần một vài gợi ý về các mã:

  • Kể từ array của bạn chứa các đối tượng mà thực hiện <MKAnnotation>, thay vì lặp qua nó, bạn có thể thêm tất cả các chú thích trong một shot bằng cách gọi addAnnotations (số nhiều) và vượt qua nó là mảng
  • Trong viewForAnnotation, không có thuộc tính nào bạn đang đặt phụ thuộc vào bất kỳ chú thích cụ thể nào để bạn có thể đặt tất cả chúng bên trong khối if (av == nil). Bằng cách này bạn sẽ có được tái sử dụng tối đa.
  • Cũng trong viewForAnnotation, sau và bên ngoài if, bạn nên đặt thuộc tính annotation của chế độ xem thành chú thích hiện tại. Đây là trường hợp chế độ xem đang được sử dụng lại từ một chú thích khác.
  • Cuối cùng, trong viewForAnnotation, đừng cho rằng annotation sẽ thuộc loại MyClass. Nếu bạn bật showsUserLocation, điều đó sẽ không xảy ra. Sẽ an toàn hơn khi khai báo tham số là id<MKAnnotation> và sau đó nếu cần kiểm tra xem lớp của nó là gì và sau đó truyền nó.
+0

Cảm ơn bạn đã điểm cuối cùng của bạn. Luôn luôn học –

1

@Anna, bạn nói rằng bạn không nên quan tâm đến thứ tự của chú thích. Điều đó không đúng trong trường hợp của tôi. Một số chú thích có thể trùng lặp và tôi luôn cần một chú thích cụ thể để ở trên cùng của hai chế độ xem chồng chéo. Vì vậy, thứ tự DO làm cho tinh thần cho các chú thích, như tôi hy vọng các - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation được gọi theo thứ tự như tôi đã thêm các chú thích.

EDIT: and the solution is here :-)

+1

Giải pháp được liên kết liên quan đến thứ tự hiển thị của chú thích ** _ views _ ** (không phải là đối tượng id ** _ model _ ** là câu hỏi của OP). Ngoài ra, phương thức ủy nhiệm viewForAnnotation _can_ được gọi nhiều lần cho cùng một chú thích ngay cả _after_ nó được thêm vào (ví dụ: nếu bạn cuộn/thu phóng bản đồ và chú thích trở lại màn hình). Giả định của bạn có thể "làm việc" với một số lượng nhỏ các chú thích hoặc với một phiên bản hệ điều hành cụ thể nhưng bạn không nên hy vọng hoặc dựa vào nó. – Anna

+0

vì vậy, Anna, là thứ tự z của chú thích không cấu hình được? – wreckgar23

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