1

したがって、2 つのビューがあります。そのうちの 1 つは、ユーザーがセルを追加してセルにデータを入力できる UITableVew です。2 番目のビューは、追加時の情報 (名前、日付、会社、バーコードをスキャンする場所) です。その画像をスキャンすると、スキャンしたものの画像が表示されます (Zbar バーコード スキャナーで完了)。したがって、主な問題は、ユーザーが追加した異なるセルごとに異なる画像を正確に保存するにはどうすればよいかということです。

コード:

ズバー:

    - (IBAction)cameraButtonTapped:(id)sender
    {
    // Check for camera
    if ([UIImagePickerController               isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == YES) {
        // Create image picker controller
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

        // Set source to the camera
        imagePicker.sourceType =  UIImagePickerControllerSourceTypeCamera;

        // Delegate is self
        imagePicker.delegate = self;

        // Show image picker
        [self presentModalViewController:imagePicker animated:YES];
    }

    }


    - (void) imagePickerController: (UIImagePickerController*)reader
    didFinishPickingMediaWithInfo: (NSDictionary*) info
    {
    // ADD: get the decode results
    id<NSFastEnumeration> results =
    [info objectForKey: ZBarReaderControllerResults];
    ZBarSymbol *symbol = nil;
    for(symbol in results)
        // EXAMPLE: just grab the first barcode
        break;

    // EXAMPLE: do something useful with the barcode data
    resultText.text = symbol.data;

    // EXAMPLE: do something useful with the barcode image
    resultImage.image =
    [info objectForKey: UIImagePickerControllerOriginalImage];

    // ADD: dismiss the controller (NB dismiss from the *reader*!)

    [reader dismissModalViewControllerAnimated:YES];

    }

    -(UIView*)CommomOverlay{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,480)];

    UIImageView *TopBar = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,58)];
    [TopBar setImage:[UIImage imageNamed:@""]];
    [view addSubview:TopBar];

    UILabel *Toplabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 9, 300, 30)];
    [Toplabel setFont:[UIFont fontWithName:@"Heiti TC light" size:22]];
    [Toplabel setTextAlignment:UITextAlignmentCenter];
    [Toplabel setBackgroundColor:[UIColor clearColor]];
    [Toplabel setTextColor:[UIColor lightGrayColor]];
    [Toplabel setNumberOfLines:1];
    [Toplabel setText:@"Turn your device sideways to scan"];
    [TopBar addSubview:Toplabel];

    UIImageView *FrameImg = [[UIImageView alloc] initWithFrame:CGRectMake(40,50,240,370)];
    [FrameImg setImage:[UIImage imageNamed:@"scanImage.png"]];
    [view addSubview:FrameImg];
    return view;
}



- (IBAction) scanButtonTapped
{
    // ADD: present a barcode reader that scans from the camera feed
    ZBarReaderViewController *reader = [ZBarReaderViewController new];
    reader.readerDelegate = self;
    reader.supportedOrientationsMask = ZBarOrientationMaskAll;

    ZBarImageScanner *scanner = reader.scanner;
    // TODO: (optional) additional reader configuration here

    // EXAMPLE: disable rarely used I2/5 to improve performance
    [scanner setSymbology: ZBAR_I25
                   config: ZBAR_CFG_ENABLE
                       to: 0];

    // present and release the controller
    reader.cameraOverlayView = [self CommomOverlay];

    [self presentModalViewController: reader
                            animated: YES];

}

コアデータを使用することを考えましたが、どこにもチュートリアルが見つかりません。次に、アプリのドキュメントフォルダーに保存することを考えました。それが私にとって最善の方法だと思います。私はこれが初めてなので、説明的なコードが役立ちます:)

アップデート:

- (IBAction)save:(id)sender {
    NSManagedObjectContext *context = [self managedObjectContext];

    UIImage *image = resultImage.image;
    NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format.
    NSFileManager *fileManager = [NSFileManager defaultManager];//create instance of NSFileManager
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it
    NSString *documentsDirectory = [paths objectAtIndex:0]; //create NSString object, that holds our exact path to the documents directory
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@KYRO Receipts Images/Barcode.png", resultImage]]; //add our image to the path
    [fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; //finally save the path (image)
    NSLog(@"image saved");

    if (self.device) {
        // Update existing device
        [self.device setValue:self.nameOfItem.text forKey:@"name"];
        [self.device setValue:self.dateOfPurchase.text forKey:@"date"];
        [self.device setValue:self.companyOfItem.text forKey:@"company"];


    } else {
       // 
        NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Receipt" inManagedObjectContext:context];
        [newDevice setValue:self.nameOfItem.text forKey:@"name"];
        [newDevice setValue:self.dateOfPurchase.text forKey:@"date"];
        [newDevice setValue:self.companyOfItem.text forKey:@"company"];

    }

    NSError *error = nil;
    // Save the object to persistent store
    if (![context save:&error]) {
        NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
    }
    [WTStatusBar setStatusText:@"Saving data..." animated:YES];
    [self performSelector:@selector(setTextStatusProgress3) withObject:nil afterDelay:0.1];

        [self.navigationController popViewControllerAnimated:YES];
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];


}
4

1 に答える 1

1

すでに Core Data を使用している場合は、画像のサイズに応じて、画像を NSData に変換して Core Data 内に直接保存するか (画像が小さい場合)、またはドキュメント ディレクトリ内に保存して、 Core Data 内のファイル名。

完全な Core Data チュートリアルはここでは扱う範囲を超えているため、画像を一意の名前でドキュメント ディレクトリに保存する方法について説明します。以下のコードの一部は、「iOS Programming: The Big Nerd Ranch Guide」から改作されていることに注意してください。

// Method to save your image file. Returns the file name for you to save in Core Data or elsewhere.
- (NSString *)saveImage:(UIImage *)image {
    // Generate a unique key to name the image file
    CFUUIDRef newUniqueID = CFUUIDCreate(kCFAllocatorDefault);
    CFStringRef newUniqueIDString = CFUUIDCreateString(kCFAllocatorDefault, newUniqueID);
    NSString *imgkey = (__bridge NSString *)newUniqueIDString;

    // Get a path for the image file in the documents directory
    NSString *imagePath = [self imagePathForKey:imgkey];

    // Convert the UIImage into NSData and save it to the documents directory
    NSData *imageData = UIImageJPEGRepresentation(img, 0.5);
    [imageData writeToFile:imagePath atomically:YES];

    // Clean up
    CFRelease(newUniqueIDString);
    CFRelease(newUniqueID);

    return imgkey;
}

// Method to provide the image path for saving/retrieving the image
- (NSString *)imagePathForKey:(NSString *)key {
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [documentDirectories objectAtIndex:0];

    return [documentDirectory stringByAppendingPathComponent:key];
}

次のメソッドは、画像を取得します。

- (UIImage *)imageForKey:(NSString *)imgkey {
    result = [UIImage imageWithContentsOfFile:[self imagePathForKey:imgkey thumbnail:FALSE]];
    if (!result) {
        // File not found - add code here as needed (to return default image or whatever)
    }
    return result;
}

テーブルに複数の画像を同時に表示する場合は、画像が小さいことを確認する必要があります。そうしないと、メモリの問題が発生する可能性があります。この場合、それらをテーブル ビューのサムネイル形式に変換し、詳細ビューにのみフル サイズの画像を表示します (サムネイルを生成する方法は別の問題になります)。

于 2013-03-25T12:28:00.863 に答える