2013-12-15 6 views
0

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

- (void)viewDidLoad 
{  Trash = [NSMutableArray array]; 
    filenames = [NSMutableArray new]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSArray *locationStrings = [[NSArray alloc]initWithObjects:@"Bottoms", @"Dress", @"Coats", @"Others", @"hats", @"Tops",nil ]; 
    for(NSString* location in locationStrings){ 
     NSString *fPath = [documentsDirectory stringByAppendingPathComponent:location]; 
     NSError *error; 
     NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fPath error:&error]; 
     collectionTrash.delegate =self; 
     collectionTrash.dataSource=self; 
     for(NSString *str in directoryContent){ 
      NSString *finalFilePath = [fPath stringByAppendingPathComponent:str]; 
      [filenames addObject:finalFilePath]; 
     } 
    } 

} 

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    NSLog(@"j"); 
    return 1; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return [filenames count]; 
    NSLog(@"b"); 


} 



- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"ReuseID"; 
    TrashCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; 
    UIImageView *imageInCell = (UIImageView*)[cell viewWithTag:1]; 

    NSString *cacheKey = filenames[indexPath.item]; 
    imageInCell.image = [self.imageCache objectForKey:cacheKey]; 

    if (imageInCell.image == nil) { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      UIImage *image = [UIImage imageWithContentsOfFile:filenames[indexPath.item]]; 
      if (image) { 
       [self.imageCache setObject:image forKey:cacheKey]; 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        TrashCell *updateCell = (id)[collectionView cellForItemAtIndexPath:indexPath]; 
        UIImageView *imageInCell = (UIImageView*)[updateCell viewWithTag:1]; 
        imageInCell.image = image; 
       }); 
      } 
     }); 
    } 

    return cell; 
} 

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ 

    NSLog(@"s:%d", [Trash count]); 
    NSString *trashBin = [Trash objectAtIndex:indexPath.row]; 
    NSLog(@"k%@l",trashBin); 
    [filenames removeObjectAtIndex:indexPath.row]; 
    [Trash removeObjectAtIndex:indexPath.row]; 
    [self deleteMyFiles:trashBin]; 
    [collectionView deleteItemsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil]]; 
} 
NSString *myFileName; 
-(void) deleteMyFiles:(NSString*)filePath { 
    NSError *error; 

    if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { 
     [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error]; 

    } else { 
     NSLog(@"%@",filePath); 
    } 
} 



- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 

    [self.imageCache removeAllObjects]; 
} 

Когда я пытаюсь открыть журнал, выдается ниже.

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array' 
*** First throw call stack: 
(0x30afbe83 0x3ae5c6c7 0x30a31d95 0x638e9 0x3349d76f 0x3349d495 0x33406ea3 0x33406ea3 0x332781a1 0x332af9fd 0x332af3ab 0x33284d79 0x33283569 0x30ac6f1f 0x30ac63e7 0x30ac4bd7 0x30a2f471 0x30a2f253 0x357632eb 0x332e4845 0x628a5 0x3b355ab7) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

ответ

0

Ваш Trash массив не содержит объектов. И вы пытаетесь получить доступ к объекту из массива Trash

NSString *trashBin = [Trash objectAtIndex:indexPath.row];

Что является причиной аварии.

Примечание: имя объекта должно начинаться с небольших букв.

+0

спасибо за ответ. И что же мне делать? Ive сделал весь трюк в нижнем регистре – user3000791

+0

, убедитесь, что ваш контент «Trash» является тем объектом, которого вы хотите использовать в будущем. –

+0

Я не знаю, что делать, Должен ли я просто изменить корзину на имена файлов? или добавить что-то в мой код? или ... – user3000791

0

В коде Trash = [NSMutableArray array]; будет autoreleased на какое-то время, поэтому, когда вы к нему доступ в '- (ничтожной) CollectionView: (UICollectionView *) CollectionView didSelectItemAtIndexPath: (NSIndexPath *) indexPath', он был освобожден. Если вы уверены, что есть причина использовать эту переменную вместо использования только filenames, вы можете сделать это Trash = [[NSMutableArray array] retain]; или Trash = [[NSMutableArray alloc] init]; в своем '- (void) viewDidLoad'.

0

Непонятно, что вы пытаетесь сделать. Понятие «Корзина» предполагает, что вы пытаетесь реализовать двухэтапное удаление: поместите элементы в корзину и через некоторое время выпустите мусор (удалите их навсегда, когда пользователь выбирает кнопку «Очистить корзину»). Но ваш пост и ваш код предлагают одноэтапное удаление (пользователь выбирает удаление без возможности отменить).

Ваш collectionView:didSelectItemAtIndexPath: Метод делегата выглядит особенно смущенным. Как правильно указывает Bhumeshwer, ваш Trash пуст, и попытка получить доступ к любому индексу вызывает вашу аварию. Нет, где в этом коде вы помещаете что-либо в Trash Но, просто удалив эту строку кода, я не думаю, что метод будет делать то, что вы хотите.

Если вы реализуете двухэтапное удаление, я думаю, вы просто хотите удалить строку с filenames и добавить ее в Trash. Не удаляйте объект с Trash и не удаляйте файлы в Trash. Где-то еще (например, когда выбрана кнопка «Очистить корзину»), вызовите deleteMyFiles, чтобы удалить корзину.

Если вы выполняете одноэтапное удаление, избавитесь от Trash все вместе: не выделяйте его в viewDidLoad и не пустите его в didSelectItemAtIndexPath. Просто удалите объект из имен файлов и обновите imageInCell!

Предложения:

  • двигаться

    collectionTrash.delegate = Я; collectionTrash.dataSource = self;

где бы ни происходило создание и инициализация коллекцииTrash.Внутри viewDidLoad и внутри цикла for это вне контекста. Смешивание несвязанных строк кода делает ваш код неорганизованным и запутанным. По крайней мере, переместите его из цикла for.

  • думаю модель-view-контроллер. Какая здесь модель? Это filenames или Trash? Является ли CollectionView вид filenames или Trash? Что такое collectionTrash?

  • Trash должно быть trash (как указывает Bhumeshwer);

  • Что такое NSString *myFileName; и что он там делает?

  • не забудьте управлять своим imageCache. Вы помещаете изображения, но не вынимаете их. Когда вы удаляете файл с filenames, удалите изображение с imageCache.

Я мог бы продолжать, но остановлюсь здесь. Удачи.

Смежные вопросы