Я создал следующий метод для определения вида моих аннотаций в виде карты.
- (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)
только для того, чтобы сигнализировать компилятору, что это нормально?
Я тоже безуспешно пытался найти информацию об этом.
Я очень благодарен за любые ответы на этот вопрос.