所以这就是我到目前为止所尝试的:
我已经构建了一些拍摄照片的代码(只有重要的代码段):
- (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
进行如下操作:
但我收到错误:由于未捕获的异常'NSInvalidArgumentException'而终止应用,原因:' - [UIButton length]:无法识别的选择器发送到实例
任何想法为什么?
断点告诉我这个:
这些:
我注意到了这一点:
这来自调试:
upload_selfie
连接到按钮
答案 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) {
}];
})