iOS: простой вызов NSMutableArray - PullRequest
0 голосов
/ 03 апреля 2012

Мне нужно вызвать removeObject в одном из моих методов, но я не могу понять, как это сделать правильно. Я очень плохо знаком с Objective-C, и все еще изучаю основы. У меня есть приложение, которое ведет себя как фотогалерея и отображает UIImageViews. Я реализую опцию, чтобы пользователь удалил фотографии из своей галереи. Чтобы добиться этого, я решил разместить невидимую кнопку над каждой картинкой. Когда пользователь нажимает кнопку «Редактировать», скрытая кнопка удаления над каждым изображением становится активной (для простоты я использую один и тот же IBOutlet над каждой из скрытых кнопок). Когда пользователь нажимает кнопку над изображением, появляется окно предупреждения с вопросом, действительно ли они хотят его удалить. Если они нажимают «да», deleteAlertView вступает в игру:

- (void)deleteAlertView:(UIAlertView *)deleteButtonPressed
       didDismissWithButtonIndex:(NSInteger)buttonIndex {
    if (buttonIndex != [deleteButtonPressed cancelButtonIndex]) {
        [array removeObject:@"%@", deleteButtonPressed];
    }

Проблема здесь [array removeObject:@"%@", deleteButtonPressed];, я сделал% @, чтобы он автоматически определял, какой объект в массиве был нажат, вместо того, чтобы вручную вводить новый метод и кнопку для каждого UIImageView (возможно, мне придется в конечном итоге делая это). Я получаю ошибки, касающиеся «массив» и «deleteButtonPressed» (использование необъявленного идентификатора), я не могу на всю жизнь выяснить, что вместо этого поставить. Я все еще изучаю основы и как работает наследование на этом языке. Любая помощь или совет будут великолепны! Мне, вероятно, следует опубликовать весь файл контроллера представления, чтобы показать соответствующее наследование:

 - (IBAction)grabImage {
    self.imgPicker = [[UIImagePickerController alloc] init];
    self.imgPicker.delegate = self;
    self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        _popover = [[UIPopoverController alloc] initWithContentViewController:imgPicker];
        [_popover presentPopoverFromRect:self.imageView.bounds inView:self.imageView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    } 

    else {
        [self presentModalViewController:imgPicker animated:YES];
    }
    [self.imgPicker resignFirstResponder];
}
// Sets the image in the UIImageView
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
    if (imageView.image == nil) {
        imageView.image = img;
        [picker dismissModalViewControllerAnimated:YES];
        [self.popover dismissPopoverAnimated:YES];
        return;

    }

    if (imageView2.image == nil) {
        imageView2.image = img;
        [picker dismissModalViewControllerAnimated:YES];
        [self.popover dismissPopoverAnimated:YES];
        return;
    }
    if (imageView3.image == nil) {
        imageView3.image = img;
        [picker dismissModalViewControllerAnimated:YES];
        [self.popover dismissPopoverAnimated:YES];
        return;
    }
}

- (void)viewWillAppear:(BOOL)animated
{

    self.user = [NSUserDefaults standardUserDefaults];

    NSMutableArray* array = [[self.user objectForKey:@"images"]mutableCopy];
    while(array == nil)
    {
        [self.user setObject:[NSMutableArray arrayWithObject:@""] forKey:@"images"];
        array = [[self.user objectForKey:@"images"]mutableCopy];
        NSLog(@"%@",@"attempting to create an array to store the images in");
    }

}

- (void)applicationDidEnterBackground:(UIApplication*)application {
    NSLog(@"Image on didenterbackground: %@", imageView);
    NSMutableArray* array = [NSMutableArray arrayWithObject:[NSData dataWithData:UIImagePNGRepresentation(imageView.image)]];

    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView2.image)]];
     [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView3.image)]];

            [self.user setObject:array forKey:@"images"];
    [user synchronize];

            }

- (void)viewDidLoad
    {
        self.user = [NSUserDefaults standardUserDefaults];
        NSLog(@"It is %@", self.user);
        NSMutableArray* array = [[self.user objectForKey:@"images"]mutableCopy];
        imageView.image = [[UIImage alloc] initWithData:[array objectAtIndex:0]];
        imageView2.image = [[UIImage alloc] initWithData:[array objectAtIndex:1]];
        imageView3.image = [[UIImage alloc] initWithData:[array objectAtIndex:2]];


        UIApplication *app = [UIApplication sharedApplication];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(applicationDidEnterBackground:)
                                                     name:UIApplicationDidEnterBackgroundNotification
                                                   object:app];

        backToGalleryButton.hidden = YES;
        tapToDeleteLabel.hidden = YES;
        deleteButton1.hidden = YES;
        [super viewDidLoad];

    }

     - (IBAction)deleteButtonPressed:(id)sender {
    UIAlertView *deleteAlertView = [[UIAlertView alloc] initWithTitle:@"Delete"
                                                              message:@"Are you sure you want to delete this photo?"
                                                             delegate:self
                                                    cancelButtonTitle:@"Yes"
                                                    otherButtonTitles:@"No", nil];
    [deleteAlertView show];

}

- (void)deleteAlertView:(UIAlertView *)deleteButtonPressed
       didDismissWithButtonIndex:(NSInteger)buttonIndex {
    if (buttonIndex != [deleteButtonPressed cancelButtonIndex]) {
        [array removeObject:@"%@", deleteButtonPressed];
    }       

}

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

Здесь есть одна вещь, но сначала относительно небольшая точка:

 - (void)deleteAlertView:(UIAlertView *)deleteButtonPressed didDismissWithButtonIndex:(NSInteger)buttonIndex

фраза "deleteButtonPressed" подразумевает четность, поскольку она заканчивается глаголом.На самом деле это ссылка на объект, в частности на параметр типа UIAlertView.Вы должны назвать это чем-то вроде AlertView.

Во-вторых, эта строка совершенно неправильная:

[array removeObject:@"%@", deleteButtonPressed];

Вы пытаетесь удалить строку.Если этот метод принимает список аргументов (где вы передаете несколько объектов, разделенных запятой), вы удалили бы буквально «deleteButtonPressed».Вы хотите удалить объект, на который указывает переменная deleteButtonPressed.Так что все, что вам нужно сделать, это:

 [array removeObject:deleteButtonPressed];
1 голос
/ 03 апреля 2012

Проблема здесь [array removeObject:@"%@", deleteButtonPressed];

Да, это одна из проблем (даже игнорирование неверного синтаксиса).Массив не содержит ваш UIAlertView, он содержит все объекты, которые [user objectForKey:@"images"] содержит.Кажется, что они должны быть NSData экземплярами и которые в любом случае не являются вашими UIAlertView экземплярами.

Другими словами, вы не можете передать UIAlertView в массив, чтобы массив мог магическим образом определить, какому элементу UIAlertView должен соответствовать.Вместо этого вам следует пометить UIAlertView индексом, которому он соответствует при его создании.Вы можете сделать это следующим образом:

UIAlertView *deleteAlertView = [[UIAlertView alloc] initWithTitle:@"Delete"
                                                              message:@"Are you sure you want to delete this photo?"
                                                             delegate:self
                                                    cancelButtonTitle:@"Yes"
                                                    otherButtonTitles:@"No", nil];
int imageIndex = <figure out the index of the associated array element based upon 'sender'>;
deleteAlertView.tag = imageIndex;

... и затем, когда кнопка будет нажата, вы сделаете:

[array removeObjectAtIndex:deleteButtonPressed.tag];

И чтобы устранить эту проблему с «необъявленным идентификатором», выследует объявить array в заголовке, а не в viewDidLoad.Вы хотите, чтобы это была частная переменная экземпляра, а не локальная переменная.

Также обратите внимание, что удаление элемента из [[user objectForKey:@"images"] mutableCopy] не автоматически приведет к удалению соответствующего элемента из [user objectForKey:@"images"].Вам нужно записать измененный массив обратно в [NSUserDefaults standardUserDefaults], если вы хотите, чтобы изменение действительно сохранялось.

0 голосов
/ 03 апреля 2012

Вы получаете ошибку «Использование массива необъявленных идентификаторов», потому что вы объявляете массив различными методами, но не в своем методе deleteAlertView.Я предлагаю прочитать о переменной области видимости.

Исправление, однако, не заставит ваш код работать, потому что у вас есть некоторые фундаментальные недостатки дизайна, которые необходимо устранить.

Вы упоминаете, что выя новичок, поэтому я бы посоветовал прочитать и завершить несколько уроков для начинающих, прежде чем пытаться это приложение.Я знаю, что увлекательно погружаться прямо в проект, но вы, скорее всего, разочаруетесь и также разовьете вредные привычки в отношении дизайна / разработки приложений.В частности, я бы попытался получить более четкое представление о переменной области действия и шаблонах проектирования MVC.

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