Obj-C — возвращает аннотации класса в MapView после их удаления?

#ios #objective-c

#iOS #цель-c

Вопрос:

Я использую приведенный ниже блок кода, чтобы удалить все аннотации класса из моего MapView, и это отлично работает.

ViewController.h

 @property (strong, retain) NSMutableArray *breweryAnnotations;
 

ViewController.m

   -(void)removeBreweries {
        
self.breweryAnnotations = [[NSMutableArray alloc] init];
        self.breweryAnnotations = [NSMutableArray arrayWithCapacity:[self.mapView.annotations count]];
         for (int i = 0; i < [self.mapView.annotations count]; i  ) {
             
        if ([[self.mapView.annotations objectAtIndex:i] isKindOfClass:[BreweryAnnotation class]]) {
           [self.breweryAnnotations addObject:[self.mapView.annotations objectAtIndex:i]];
          }
         }
    
         [self.mapView removeAnnotations:self.breweryAnnotations];
   
    }
 

Тем не менее, сейчас я пытаюсь написать блок, который возвращает все ранее удаленные аннотации класса обратно на мою карту. Есть какие-нибудь идеи, как я могу это сделать (учитывая, что теперь количество BreweryAnnotations на карте технически равно 0)?

Чтобы вспомнить аннотации:

 [self.mapView addAnnotations:self.breweryAnnotations];
 

Комментарии:

1. Я думаю, вам нужно сохранить annotationsToRemove , поскольку вы хотите добавить их обратно. Допустим, вы поместили это в ivar, тогда вы можете просто сделать [self.mapView addAnnotations:self.annotationsToRemove] , когда захотите добавить их обратно.

2. Другими словами [self.mapView addAnnotations:[self.mapView annotations]]; , добавляет аннотации к карте, которые являются аннотациями карты с этим. Ака ничего не изменилось, кроме загрузки процессора: D ps: надеюсь, у вас все хорошо ^^

3. @OlSen Да, все хорошо, с теплым сердцем… @Brittany Я думаю, вам следует назвать этого ивара чем -то вроде breweryAnnotations , а затем в removeBreweries сообщении заменить все annotationsToRemove на self.breweryAnnotations . На самом деле, вам следует подумать о том, чтобы делать все это с помощью ваших ВК undoManager , чтобы облегчить себе жизнь.

4. Смотрите правки кода выше @skaak. Ваше предложение имеет полный смысл. Я вспоминаю аннотации, и они заполняют массив self.breweryAnnotations при регистрации, но аннотации по-прежнему отсутствуют на карте?

Ответ №1:

РЕДАКТИРОВАТЬ, улучшая мои улучшения.

 @interface ViewController ()

@property (nonatomic,strong) NSArray * breweryAnnotations;  // Keep unmutable and use nonatimic not retain

@end

@implementation ViewController

- ( void ) removeBreweries
{
    // Iterate this way - very efficient
    // Retain
    self.breweryAnnotations = [self.mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithBlock: ^ BOOL ( id obj, NSDictionary * d ) {
        
        return [obj isKindOfClass:BreweryAnnotation.class];
        
    }]];

    // Now remove
    [self.mapView removeAnnotations:self.breweryAnnotations];
}

// Toggle with undo / redo
- ( void ) toggleBreweryAnnotations
{

    // Test for nil
    if ( self.breweryAnnotations )
    {
        [self.mapView addAnnotation:self.breweryAnnotations];
        self.breweryAnnotations = nil;
    }
    else
    {
        [self removeBreweries];
    }

    // Now you have undo / redo
    [self.undoManager registerUndoWithTarget:self
                     handler: ^ ( id target) {

        [target toggleBreweryAnnotations];

    }];
}
 

Есть несколько незначительных изменений в ivar и вашем коде — причину см. В комментариях. Я надеюсь, что это улучшения. Я также использую диспетчер отмены для переключения аннотаций в качестве улучшения, которое вы можете рассмотреть. Теперь я не уверен, сработает ли это, поскольку я не тестировал это с этой стороны, но, надеюсь, это должно сработать.

Поскольку это на самом деле не меняет ваш код, я подозреваю, что вы не сможете повторно использовать аннотацию, но я не уверен в этом. Но посмотрите, как это происходит, и дайте мне знать, и мы возьмем это оттуда.

Комментарии:

1. приятное улучшение. Пивоварня beer==true?

2. @OlSen <hic> NSLog ( @"VGhlIER1dGNoIGJlZXIgaXMgZ3JlYXQgYnV0IEkgc3VzcGVjdCBHZXJtYW4gaXMgYmV0dGVyLg==" );