上传图像以解析数据库

时间:2014-04-16 15:02:53

标签: ios objective-c database parse-platform

所以这就是我到目前为止所尝试的:

我已经构建了一些拍摄照片的代码(只有重要的代码段):

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    UIImage *chosenImage = info[UIImagePickerControllerOriginalImage];
    self.imageView.image = chosenImage;
    _camera_button.hidden = true;
    _camera_imageview.hidden = false;
    [_next_camera setEnabled:YES];
    NSData *imageData = UIImagePNGRepresentation(chosenImage);
    [self upload_selfie:imageData];

    [picker dismissViewControllerAnimated:YES completion:NULL];
}

然后当您点击按钮时,我希望它上传到数据库。这就是我的尝试:

- (IBAction)upload_selfie:(NSData *)data{
    PFFile *imageFile = [PFFile fileWithName:@"Image.png" data:data];
    [imageFile saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (!error) {
            // Hide old HUD, show completed HUD (see example for code)

            // Create a PFObject around a PFFile and associate it with the current user
            PFObject *selfie = [PFObject objectWithClassName:@"selfie1"];
            [selfie setObject:imageFile forKey:@"imageFile"];


            PFUser *user = [PFUser currentUser];
            [selfie setObject:user forKey:@"imageFile"];

            [selfie saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                if (!error) {
                }
                else{
                    NSLog(@"Error: %@ %@", error, [error userInfo]);
                }
            }];
        }
        else{
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];
}

在解析时对selfie1进行如下操作: enter image description here


但我收到错误:由于未捕获的异常'NSInvalidArgumentException'而终止应用,原因:' - [UIButton length]:无法识别的选择器发送到实例

任何想法为什么?


断点告诉我这个:

enter image description here

这些: enter image description here

我注意到了这一点:

enter image description here

这来自调试:

enter image description here


我如何将upload_selfie连接到按钮

enter image description here


未声明标识符错误的照片:

enter image description here

3 个答案:

答案 0 :(得分:2)

我做了几次尝试。它可能需要一些工作/测试,但是: 这可能是一个解决方案:
变化:

- (IBAction)upload_selfie:(NSData *)data

要:

- (IBAction)upload_selfie:(id)sender withData:(NSData *)data
{
    if ([data isKindOfClass:[NSData class]])
    {
    //Put the rest of your code, it what would called manually
    }
    else
    {
        // User clicked on the button, but didn't "send" data with it.
    }
}

使用[self upload_selfie:nil withData:imageData];

进行调用

问题:为什么?
如果您拨打IBAction方法,则会随身携带sender 请记住,我们通常会写:-(IBAction)actionMethod:(id)sender。如果您想检查发件人,可以使用UIButton:UIButton *button = (UIButton *)sender; 所以,根据我的理解,这种方法将第一个参数作为发送者,如果它是从用户交互中调用的(通过代码调用与[self actionMethod:mySender]相反)。
但是我不明白的一个原因是你最初把它作为IBAction,并且似乎没有将“直接用户操作”链接到它。

编辑:
经过更多解释,我建议: 地址:
@property (nonatomic, strong) NSData *imageDataToSend;
[self upload_selfie:imageData];替换为:[self setImageDataToSend:imageData];
PFFile *imageFile = [PFFile fileWithName:@"Image.png" data:data];替换为:PFFile *imageFile = [PFFile fileWithName:@"Image.png" data:imageDataToSend];
-(IBAction)upload_selfie:(NSData *)data替换为-(IBAction)upload_selfie:(id)sender-(IBAction)upload_selfie:(UIButton*)button,因为您似乎很困惑。
您可以添加的内容:一旦发送self.imageDataToSend,就nil。如果IBAction不是imageDataToSend,请在nil方法的开头检查。我不知道您的所有代码是如何工作的,但是一旦您点击upload_selfie,您可能还想要禁用该按钮,以防用户多次点击(并且您不需要多次发送相同的图像)发送完成后发出“reable”(使用[button:setEnabled:TRUE/FALSE];)。

答案 1 :(得分:1)

这不是一个真正的答案,但我把它作为一个答案来突出另一个错误。

您的错误消息指出UIButton类型的对象被发送消息“length”,它没有。我在代码中看不到任何可能导致此问题的内容,因此我认为错误来自其他地方。请添加整个堆栈跟踪,也许我可以通过另一个错误的解决方案来更新答案。

但您的代码有另一个错误,就在这里:

PFUser *user = [PFUser currentUser];
[selfie setObject:user forKey:@"imageFile"];

您已将imageFile设置为图像。这应该是

PFUser *user = [PFUser currentUser];
[selfie setObject:user forKey:@"user"];

或类似。

答案 2 :(得分:0)

NSData* data = UIImageJPEGRepresentation(image, 0.3f);    
PFFile *imageFile = [PFFile fileWithName:[NSString  stringWithFormat:@"%f",[[NSDate date] timeIntervalSince1970]] data:data];
    TLPhoto *photo = [TLPhoto new];
    [photo setImageFile:imageFile];
    [photo setAlbum:album];
    [self setPermissionsForObject:photo];

    // Save the image to Parse
    dispatch_async(dispatch_get_main_queue(), ^{
        [photo save];
        [album.photos addObject:photo];
        [album saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {

        }];
    })