2012-04-07 16 views
1

私は写真ギャラリーのように動作するアプリを持っています。私は、UIImageViewの上に目に見えないボタンを置き、ボタンをタップしたときにremoveObjectを呼び出すことによって、ユーザーが写真を削除する機能を実装しています。このコードはうまく機能していますが、タグに依存しています。これを動作させるためには、インターフェイスビルダー内のすべてのUIImageView/UIButtonにタグを付ける必要があります。だから、私は現在、NSDataを使用しないでタグが動作するように画像を保存しようとしています。iOSで画像を保存する

私は今何をすべきかについて完全に迷っています。私は非常に、非常にプログラミングの新しいとショックを受けた私はこれまでこれを作った。この作業を行うために私のコードを編集するために何をどのように編集するかに関する助けやアドバイスは大変ありがとうございます!以前のコメントは正確である

- (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; 

     [self.array addObject:imageView.image]; 

     [picker dismissModalViewControllerAnimated:YES]; 
     [self.popover dismissPopoverAnimated:YES]; 
     return; 

    } 

    if (imageView2.image == nil) { 
     imageView2.image = img; 
     NSLog(@"The image is a %@", imageView); 
     [self.array addObject:imageView2.image]; 

     [picker dismissModalViewControllerAnimated:YES]; 
     [self.popover dismissPopoverAnimated:YES]; 
     return; 
    } 

    if (imageView3.image == nil) { 
     imageView3.image = img; 

     [self.array addObject:imageView3.image]; 

     [picker dismissModalViewControllerAnimated:YES]; 
     [self.popover dismissPopoverAnimated:YES]; 
     return; 
    } 

    if (imageView4.image == nil) { 
     imageView4.image = img; 

     [self.array addObject:imageView4.image]; 

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

     [self.array addObject:imageView5.image]; 

     [picker dismissModalViewControllerAnimated:YES]; 
     [self.popover dismissPopoverAnimated:YES]; 
     return; 
    } 

- (void)applicationDidEnterBackground:(UIApplication*)application { 
    NSLog(@"Image on didenterbackground: %@", imageView); 

    [self.array addObject:imageView.image]; 
    [self.array addObject:imageView2.image]; 
    [self.array addObject:imageView3.image]; 
    [self.array addObject:imageView4.image]; 
    [self.array addObject:imageView5.image]; 

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

} 

- (void)viewDidLoad 
{ 
    self.user = [NSUserDefaults standardUserDefaults]; 
    NSLog(@"It is %@", self.user); 
    self.array = [[self.user objectForKey:@"images"]mutableCopy]; 
    imageView.image = [[self.array objectAtIndex:0] copy]; 
    imageView2.image = [[self.array objectAtIndex:1] copy]; 
    imageView3.image = [[self.array objectAtIndex:2] copy]; 
    imageView4.image = [[self.array objectAtIndex:3] copy]; 
    imageView5.image = [[self.array objectAtIndex:4] copy]; 



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

    [super viewDidLoad]; 

} 


// This is when the user taps on the image to delete it. 
- (IBAction)deleteButtonPressed:(id)sender { 
    NSLog(@"Sender is %@", sender); 
    UIAlertView *deleteAlertView = [[UIAlertView alloc] initWithTitle:@"Delete" 
                   message:@"Are you sure you want to delete this photo?" 
                  delegate:self 
                cancelButtonTitle:@"No" 
                otherButtonTitles:@"Yes", nil]; 
    [deleteAlertView show]; 

    int imageIndex = ((UIButton *)sender).tag; 
    deleteAlertView.tag = imageIndex; 
} 

- (UIImageView *)viewForTag:(NSInteger)tag { 
    UIImageView *found = nil; 
    for (UIImageView *view in self.array) { 
     if (tag == view.tag) { 
      found = view; 
      break; 
     } 
    } 
    return found; 
} 

- (void)alertView: (UIAlertView *) alertView 
clickedButtonAtIndex: (NSInteger) buttonIndex 
{ 


    if (buttonIndex != [alertView cancelButtonIndex]) { 
     NSLog(@"User Clicked Yes. Deleting index %d of %d", alertView.tag, [array count]); 
     NSLog(@"The tag is %i", alertView.tag); 

     UIImageView *view = [self viewForTag:alertView.tag]; 
     if (view) { 
      [self.array removeObject:view]; 
     } 

     NSLog(@"After deleting item, array count = %d", [array count]); 
     NSLog(@"Returned view is :%@, in view: %@", [self.view viewWithTag:alertView.tag], self.view); 
     ((UIImageView *)[self.view viewWithTag:alertView.tag]).image =nil; 
    } 

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

@end 
+1

実際にデザインを使用する必要がある場合は、イメージ自体とは対照的に、nsuserdefaultsにイメージへの参照/パスを保存してください。タグ番号を含むファイル名規則を作成すると、保存されたイメージファイルを見つけることができるはずです。 – Rog

+0

@Rogいいアイデアのように聞こえます。ありがとうございます。どうすればいい?初心者の質問には申し訳ありませんが、私はまだこれについて非常に新しいです。 – John

答えて

1

タグを使用しているため、選択している画像ビューを識別できるようです。あなたは各画像の上に「見えない」ボタンがありますか?そうですか?私はあなたがボタンを介して表示されている画像を選択するタップを処理することができると仮定していますか?

これを実行する方法はたくさんありますが、簡単な解決策は、タップを認識し、そのタップの下の画像ビューを「見つける」ことです。ストーリーボード内からコントローラにUITapGestureRecognizerをドロップします。コントローラのコードにCtrlキーを押しながらドラッグすると、アクションメソッドが作成されます。これを次のように記入してください...

- (IBAction)tapGesture:(UITapGestureRecognizer*)gesture 
    { 
    CGPoint tapLocation = [gesture locationInView: self.galleryView]; 
    for (UIImageView *imageView in self.galleryView.subviews) { 
     if (CGRectContainsPoint(imageView.frame, tapLocation)) { 
     // This is the imageView that was tapped on! 
     // Do whatever you want with it now that you found it. 
     } 
    } 
    } 
+0

ありがとう、これは素晴らしい考えです。私はまだプログラミングを始めていないので、これを実装する際にいくつか問題があります。私はこの実装に関する新しい質問を作成しました: http://stackoverflow.com/questions/10097855/ios-tapgesturerecognizer-issues すべての入力が大変ありがとうございます。再度、感謝します! – John

1

;:ここ

はちょうど参照のための私の全体のファイルですこれをどのようにスケールアップするのかを考えてください。

つまり、何らかの方法で画像を保存しロードする必要があります。これは、UIImageオブジェクトをNSDataに変換することを意味します。これは、NSUserDefaults、ファイル、またはコアデータに格納するかどうかに関係なく適用されます。

UIImageはNSCodingをサポートしていますので、それを使用できます。あなたは最終的にそれを必要とするので、それを使用する方法について読む。また、PNG形式またはJPEG形式を常に使用することがわかっている場合は、UIImagePNGRepresentation(UIImage *image)UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality)という機能があります。これはあなたの当面の問題を解決します

[self.array removeAllObjects]; 
NSArray *dataArray = [self.user objectForKey:@"images"]; 
for (NSData *imageData in dataArray) 
    [self.array addObject:[UIImage imageWithData:imageData]]; 

、しかししてください:のviewDidLoad中にこれらを取得するには、次に

NSMutableArray *dataArray = [NSMutableArray array]; 
[dataArray addObject:UIImagePNGRepresentation(imageView.image)]; 
[dataArray addObject:UIImagePNGRepresentation(imageView2.image)]; 
[dataArray addObject:UIImagePNGRepresentation(imageView3.image)]; 
[self.user setObject:dataArray forKey:@"images"]; 
[self.user synchronize]; 

:NSDataのバックUIImageにオブジェクトを変換するには、ここで[UIImage imageWithData:NSData*]を使用するには、あなたがapplicationDidEnterBackgroundに持つことができるものですそれを恒久的な解決策と見なさないでください。考えてみましょう:ファイルやコアデータで

  1. ストアあなたのイメージを、NSUserDefaultsは、大量のコンテンツを持っていることになっていない あるとして。
  2. UITableViewを使用して画像を表示するので、ハードコーディングする代わりに を任意の数に設定できます。
  3. UITableViewに必要なレイアウトがない場合は、画像の配列を表示してタップに適切に応答するカスタム UIViewサブクラスを作成します。
  4. が停止またはシャットダウンされる可能性のあるすべての方法をアプリケーションが検出できることを確認してください。 ApplicationDidEnterBackground通知が常に得られるとは限りません。または、発生した後にすべてのデータを保存する時間が になっていない可能性があります。 UIViewControllerが複数ある場合は、アプリケーション 自身が通知を受け取らずに、このUIViewControllerがアンロードされる可能性があります。
+0

コードをコピーしてappDidEnterBackgroundとviewDidLoadメソッドに貼り付けましたが、何らかの理由で画像が保存されません。 – John

+0

NSArserDefaultsに追加する前にdataArrayの内容を 'NSLogできますか? – Dondragmer

+0

applicationDidEnterBackgroundのNSLogはどうですか?また、データがNSUserDefaultsに書き込まれているように見える場合は、すぐに同じキーを再度読み取ってみてください。 – Dondragmer

関連する問題