#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==" );