MKPinAnnotationView и пользовательские классы, соответствующие протоколу MKAnnotation - PullRequest
1 голос
/ 16 июля 2011

Я создал следующий метод для определения вида моих аннотаций в виде карты.

- (MKAnnotationView *)mapView:(MKMapView *)mv viewForAnnotation:(id <MKAnnotation>)annotation
{

if ([annotation isKindOfClass:[MKUserLocation class]]) 
{
    return nil;
}

MKPinAnnotationView *pin;

if ([annotation isKindOfClass:[AnnotationsWithIndices class]])
{
int i = [(AnnotationsWithIndices *)annotation index];


if (i > currentCheckpointIndex ) 
{

    pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"unvisited"]; 
    if (!pin) 
    {
        pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"unvisited"];
    }
    [pin setPinColor:MKPinAnnotationColorRed]; 
}   

if (i == currentCheckpointIndex) 
{
    pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"current"];
    if (!pin) 
    {
        pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"current"];
    }
    [pin setPinColor:MKPinAnnotationColorGreen]; 
}

if (i < currentCheckpointIndex) 
{
    pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"visited"]; 
    if (!pin) 
    {
        pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"visited"];
    }
    [pin setPinColor:MKPinAnnotationColorPurple];
}
[pin setAnimatesDrop:YES];
return [pin autorelease];
}
else
     return nil;
}

Идея состоит в том, что я хочу, чтобы различные виды (контакты) аннотации были разных цветов в зависимости от того, посетил ли их пользователь, чтобы указать, какую аннотацию следует посетить дальше.

Этот код работает нормально, но у меня есть несколько вопросов по этому поводу, которые, я надеюсь, кто-то может ответить.

Во-первых, аннотации MKPin аннотации снимаются с карты и используются по мере возможности.В этой строке (которую я нашел в нескольких блогах и форумах)

pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"unvisited"]; 

Я понимаю, что возвращаемое значение dequeueReusableAnnotationViewWithIdentifier: является экземпляром MKAnnotationView, тогда как pin является указателем наэкземпляр MKPinAnnotationView (который является подклассом MKAnnotationView).По-моему, именно поэтому перед вызовом метода происходит «приведение» с префиксом (MKPinAnnotationView *).Действительно ли это приведение, и в этом случае это не опасно, поскольку MKPinAnnotationView содержит больше переменных экземпляра (чем MKAnnotationView) и, следовательно, больше места в памяти?

Я пытался найти некоторую информацию об этом, но нигдеЯ не нашел никого, объясняющего это, в частности.

Кроме того, аннотация указателя относится либо к классу MKUserLocation, либо к моему собственному пользовательскому классу AnnotationsWithIndices, соответствующему протоколу MKAnnotation.Теперь, чтобы определить, какой цвет должен иметь вид аннотации, я добавил переменную экземпляра index в класс AnnotationsWithIndices.Теперь, когда я вызываю получатель для индекса, я пишу

int i = [(AnnotationsWithIndices *)annotation index]; 

Теперь у меня в основном тот же вопрос по этому поводу.Здесь происходит приведение или это просто для того, чтобы компилятор знал, что можно отправлять индекс сообщения в аннотацию?Я предполагаю, что компилятор ожидает, что аннотация будет идентификатором, тогда как на самом деле это указатель на экземпляр AnnotationsWithIndices.Конечно, я знаю, что это так, поскольку аннотация будет моего пользовательского класса, и я также проверяю это явно, чтобы быть уверенным.(AnnotationsWithIndices) только для того, чтобы сигнализировать компилятору, что это нормально?

Я тоже безуспешно пытался найти информацию об этом.

Я очень благодарен за любые ответы на этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...