在NSDocumentDirectory和UIScrollView中删除

我的代码出现问题,能够在UIScrollView预览包含图像的缩略图。 我的图片来自NSDocumentDirectory 。 我可以从中删除但是我可以从它中删除(在VIEWNSDocumentDirectory )当我从右到左位置时正确。

问题:现在,我可以删除,但我有几个问题。

  • 首先 ,虽然我可以删除,但视图没有排列,我的rearrangeItems:方法也没有被调用。

  • 第二 ,然后在第一次加载时我无论如何都可以删除,但就像我所说的rearrangeItems:方法没有被调用,所以他们的名字没有被renamed

  • 第三 ,在第一次加载时,我可以删除,但是当我退出应用程序时,我可以删除但是我在NSDocu图像没有删除。

希望有人能帮助我。 以下是我的代码的预览。

 - (void)addImage:(UIImage *)imageToAdd { [_images addObject:imageToAdd]; [_thumbs addObject:[imageToAdd imageByScalingAndCroppingForSize:CGSizeMake(60, 60)]]; int row = floor(([_thumbs count] - 1) / 5); int column = (([_thumbs count] - 1) - (row * 5)); UIImage *thumb = [_thumbs objectAtIndex:[_thumbs count]-1]; UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = CGRectMake(column*60+10, row*60+10, 60, 60); [button setImage:thumb forState:UIControlStateNormal]; [button addTarget:self action:@selector(deleteItem:) forControlEvents:UIControlEventTouchUpInside]; button.tag = [_images count] - 1; // This is the title of where they were created, so we can see them move.s [button setTitle:[NSString stringWithFormat:@"%d, %d", row, column] forState:UIControlStateNormal]; [_buttons addObject:button]; [scrollView addSubview:button]; // This will add 10px padding on the bottom as well as the top and left. [scrollView setContentSize:CGSizeMake(300, row*60+20+60)]; } - (void) deleteItem:(id)sender { _clickedButton = (UIButton *)sender; UIAlertView *saveMessage = [[UIAlertView alloc] initWithTitle:@"" message:@"DELETE?" delegate:self cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil]; [saveMessage show]; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; if([title isEqualToString:@"YES"]) { NSLog(@"YES was selected."); UIButton *button = _clickedButton; [button removeFromSuperview]; [_buttons removeObjectAtIndex:button.tag]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"oneSlotImages%lu.png", button.tag]]; [fileManager removeItemAtPath: fullPath error:NULL]; [self rearrangeItems:button.tag]; } } - (void)viewDidAppear:(BOOL)animated { [_thumbs removeAllObjects]; for(int i = 0; i <= 100; i++) { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDir = [paths objectAtIndex:0]; NSString *savedImagePath = [documentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"Images%d.png", i]]; NSLog(@"savedImagePath=%@",savedImagePath); if([[NSFileManager defaultManager] fileExistsAtPath:savedImagePath]){ [self addImage:[UIImage imageWithContentsOfFile:savedImagePath]]; //NSLog(@"file exists"); } } NSLog(@"Count : %d", [_images count]); } 

更新:新的重新排列方法

 - (void)rearrangeItems:(int)startIndex { for (UIButton *button in _buttons) { // Shift the tags down one if (button.tag > startIndex) { NSLog(@"called here"); // Version 2 **************************** NSFileManager *fileManager = [NSFileManager defaultManager]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"oneSlotImages%lu.png", button.tag]]; NSData *imageData = [NSData dataWithContentsOfFile:fullPath]; [fileManager removeItemAtPath: fullPath error:NULL]; // ************************************** button.tag -= 1; // Version 2 **************************** fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"oneSlotImages%lu.png", button.tag]]; [imageData writeToFile:fullPath atomically:YES]; // ************************************** // Recalculate Position int row = floor(button.tag / 5); int column = (button.tag - (row * 5)); // Move button.frame = CGRectMake(column*61+8, row*61+8, 60, 60); if (button.tag == [_buttons count] - 1) { [scrollView setContentSize:CGSizeMake(300, row*61+16+60)]; } } } } 

你显示“rearrangeButtons”但从不使用它 – 我假设上面的代码已经过时了。 无论如何,你在这里遇到一些小问题:

 [_images objectAtIndex:button.tag]; [_images removeObjectAtIndex:button.tag]; [_images removeObject:button]; 

第一个和最后一个语句没有意义,你应该使用的是:

 [_images removeObjectAtIndex:button.tag]; [self rearrangeButtons:button.tag]; 

要向应用添加健全性检查,请尝试将此代码添加到rearrangeButtons的末尾:

 int idx = 0; for (UIButton *button in _buttons) { NSLog(@"Going to query button at index %d", idx); NSLog(@"Button at index %d is of type %@", idx, NSStringFromClass([button class]); // if the button is not a UIView subclass, it won't have tag. If its a dealloced // object then it probably will crash when you ask it its class... if(button.tag != idx) NSLog(@"INDEX PROBLEM AT BUTTON ARRAY INDEC %d", idx); ++idx; } 

编辑:在循环中编辑的代码打印出对象类

EDIT2:所以我把你的代码放到一个新项目ButtonManager中 。 基本上没问题,但你有一些问题。 首先,即使没有文件存在,也可以索引文件名,因此索引可能会不同步。 其次,你使用%lu格式的button.tag,但这是一个整数,所以你应该使用“%d”。 最后,您从数组中删除按钮,但不删除图像或缩略图。

如果您下载该项目,您将在需要更改以便正常工作的所有位置看到警告。 我不确定为什么按钮索引被破坏 – 可能是其他代码。 在任何情况下都会在代码中添加一个数据一致性测试 – 在代码中调用它 – 如果它失败了那么你知道你的问题是在最后一个好测试和最新失败测试之间。

项目启动时会启动“deleteItem:”消息,只要点击“是”,就会不断删除数组中间的项目。

用这些替换你的function

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; if([title isEqualToString:@"YES"]) { NSLog(@"YES was selected."); UIButton *button = _clickedButton; [self rearrangeItems:button.tag]; } } - (void)rearrangeItems:(int)startIndex { for (UIButton *button in _buttons) { // Shift the tags down one if (button.tag > startIndex) { NSLog(@"called here"); [button removeFromSuperview];//remove the button from the scrollview [_buttons removeObjectAtIndex:button.tag];//remove the button object from _buttons array NSFileManager *fileManager = [NSFileManager defaultManager]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"oneSlotImages%lu.png", button.tag]]; NSData *imageData = [NSData dataWithContentsOfFile:fullPath]; [fileManager removeItemAtPath: fullPath error:NULL]; button.tag -= 1; fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"oneSlotImages%lu.png", button.tag]]; [imageData writeToFile:fullPath atomically:YES]; // Recalculate Position int row = floor(button.tag / 5); int column = (button.tag - (row * 5)); // Move button.frame = CGRectMake(column*61+8, row*61+8, 60, 60); if (button.tag == [_buttons count] - 1) { [scrollView setContentSize:CGSizeMake(300, row*61+16+60)]; } [scrollView setNeedsDisplay]; } } 

希望这可以帮助。