2011-06-16 66 views
2

我想從照片庫或使用相機添加圖像到我的iPad應用程序。我使用了與iPhone相同的編碼。但應用程序崩潰。我認爲這不是從圖書館添加圖片到iPad應用程序的正確方法。如果有人知道,請幫助我。如何將照片庫或照相機中的圖像添加到我的Ipad應用程序中?

-(void)ctnPhotoSelection 
{ 
    isMyCtView = YES; 
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"" 
                  delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil 
                otherButtonTitles:@"Take Photo With Camera", @"Select Photo From Library", @"Cancel", nil]; 
    actionSheet.actionSheetStyle = UIActionSheetStyleAutomatic; 
    actionSheet.destructiveButtonIndex = 1; 
    [actionSheet showInView:self.view]; 
    [actionSheet release]; 
} 

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 0) 
    { 
     [self TakePhotoWithCamera]; 
    } 
    else if (buttonIndex == 1) 
    { 
     [self SelectPhotoFromLibrary]; 
    } 

    else if (buttonIndex == 2) 
    { 
     NSLog(@"cancel"); 
    } 
} 

-(void) TakePhotoWithCamera 
{ 
    [self startCameraPickerFromViewController:self usingDelegate:self]; 
} 

-(void) SelectPhotoFromLibrary 
{ 
    [self startLibraryPickerFromViewController:self usingDelegate:self]; 
} 

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
{ 
    [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 
} 

- (BOOL)startCameraPickerFromViewController:(UIViewController*)controller usingDelegate:(id<UIImagePickerControllerDelegate>)delegateObject 
{ 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
    { 
     UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
     picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
     picker.allowsEditing = YES; 
     picker.delegate = self; 
     [controller presentModalViewController:picker animated:YES]; 
     [picker release]; 
    } 
    return YES; 
} 

- (BOOL)startLibraryPickerFromViewController:(UIViewController*)controller usingDelegate:(id<UIImagePickerControllerDelegate>)delegateObject 
{ 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) 
    { 
     UIImagePickerController *picker1 = [[UIImagePickerController alloc]init]; 
     picker1.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     picker1.allowsEditing = YES; 
     picker1.delegate = self; 
     [controller presentModalViewController:picker1 animated:YES]; 
     [picker1 release]; 
    } 
    return YES; 
} 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    UIImage * img = [info objectForKey:@"UIImagePickerControllerEditedImage"]; 
    [self useImage:img]; 
    [[picker parentViewController] dismissModalViewControllerAnimated:NO]; 
    UINavigationController* navController = self.navigationController; 
    UIViewController* controller = [navController.viewControllers objectAtIndex:0]; 
    [controller dismissModalViewControllerAnimated:NO]; 
} 

-(void)useImage:(UIImage *)theImage 
{ 
    NSData *addImageData = UIImagePNGRepresentation(theImage); 
    IpadAppDelegate *appDelegate=(IpadAppDelegate*)[ [UIApplication sharedApplication] delegate]; 

    if(isMyCtView == YES) 
    { 
     isMyCtView = NO; 
     appDelegate.imageCtData = addImageData; 
     appDelegate.isctFromDevice = YES; 
     appDelegate.isctnCntrl = YES; 
     [self.view sendSubviewToBack:myCtnView]; 
    } 

    [self reloadView]; 
} 

崩潰日誌

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'On iPad, UIImagePickerController must be presented via UIPopoverController' 
*** Call stack at first throw: 
(
0 CoreFoundation      0x3587a987 __exceptionPreprocess + 114 
1 libobjc.A.dylib      0x34a8249d objc_exception_throw + 24 
2 UIKit        0x34378317 UIImagePickerEnsureViewIsInsidePopover + 258 
3 PhotoLibrary      0x3499893b -[PLLibraryView didMoveToWindow] + 86 
4 UIKit        0x341bf76b -[UIView(Internal) _didMoveFromWindow:toWindow:] + 698 
5 UIKit        0x341bf583 -[UIView(Internal) _didMoveFromWindow:toWindow:] + 210 
6 UIKit        0x341bf433 -[UIView(Hierarchy) _postMovedFromSuperview:] + 106 
7 UIKit        0x341aa82f -[UIView(Internal) _addSubview:positioned:relativeTo:] + 678 
8 UIKit        0x341aa57f -[UIView(Hierarchy) addSubview:] + 22 
9 UIKit        0x341fc8a9 -[UINavigationTransitionView transition:fromView:toView:] + 416 
10 UIKit        0x341fc6fd -[UINavigationTransitionView transition:toView:] + 20 
11 UIKit        0x341ef8cf -[UINavigationController _startTransition:fromViewController:toViewController:] + 1274 
12 UIKit        0x341ef35f -[UINavigationController _startDeferredTransitionIfNeeded] + 182 
13 UIKit        0x341ef2a3 -[UINavigationController viewWillLayoutSubviews] + 14 
14 UIKit        0x341ef23f -[UILayoutContainerView layoutSubviews] + 138 
15 UIKit        0x341b80cf -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 26 
16 CoreFoundation      0x35818bbf -[NSObject(NSObject) performSelector:withObject:] + 22 
17 QuartzCore       0x31075685 -[CALayer layoutSublayers] + 120 
18 QuartzCore       0x3107543d CALayerLayoutIfNeeded + 184 
19 QuartzCore       0x3106f56d _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 212 
20 QuartzCore       0x3106f383 _ZN2CA11Transaction6commitEv + 190 
21 QuartzCore       0x31092f9d _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 52 
22 CoreFoundation      0x3580ac59 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 16 
23 CoreFoundation      0x3580aacd __CFRunLoopDoObservers + 412 
24 CoreFoundation      0x358020cb __CFRunLoopRun + 854 
25 CoreFoundation      0x35801c87 CFRunLoopRunSpecific + 230 
26 CoreFoundation      0x35801b8f CFRunLoopRunInMode + 58 
27 GraphicsServices     0x320c84ab GSEventRunModal + 114 
28 GraphicsServices     0x320c8557 GSEventRun + 62 
29 UIKit        0x341dc329 -[UIApplication _run] + 412 
30 UIKit        0x341d9e93 UIApplicationMain + 670 
31 IpadComicBuilder     0x00002537 main + 70 
32 IpadComicBuilder     0x000024b8 start + 52 
) 
terminate called after throwing an instance of 'NSException' 
Program received signal: 「SIGABRT」. 
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found). 
(gdb) 
+2

向我們展示使應用程序崩潰的代碼將有助於診斷您的問題。您聲明您認爲這不是添加圖片的正確方式,但我們不知道您使用的是什麼方式。 – IAmTimCorey 2011-06-16 14:43:28

+0

當應用程序崩潰時,控制檯和stacktrace會說什麼? – 2011-06-16 15:07:32

回答

8

答案就在你的錯誤消息。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'On iPad, UIImagePickerController must be presented via UIPopoverController' 

在iPad上,您不能只使用iPhone選擇圖像的方法。你需要使用一個UIPopoverController,你可以用你的UIImagePickerController傳遞:

UIPopoverController* popover = [[UIPopoverController alloc] initWithContentViewController: imagePicker];

然後實現在您的課UIPopoverControllerDelegate協議。

你可以找到這個here的一個例子。

+0

如果可能的話,您可以提供示例代碼嗎? – praveena 2011-06-17 05:52:35

2
- (void)buttonTap { 

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: nil 
                 delegate: self 
               cancelButtonTitle: @"Cancel" 
              destructiveButtonTitle: nil 
               otherButtonTitles: @"Take a new photo", 
                 @"Choose from existing", nil]; 
                [actionSheet showInView:self.view]; 
} 

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 

    int i = buttonIndex; 

     switch(i) { 

    case 0: 
    { 

     //Code for camera 

    } 
     break; 
    case 1: 
    { 
     UIImagePickerController * picker = [[UIImagePickerController alloc] init]; 
     picker.delegate = self; 
     picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     self.popover = [[UIPopoverController alloc] initWithContentViewController: picker]; 
     self.popover.delegate =self; 
     [self.popover presentPopoverFromRect:self.view.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    } 

    default: 
     // Do Nothing......... 
     break; 

    } 
} 

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

    NSLog(@"Picker returned successfully."); 

    UIImage *selectedImage; 

    NSURL *mediaUrl; 

    mediaUrl = (NSURL *)[info valueForKey:UIImagePickerControllerMediaURL]; 

    if (mediaUrl == nil) { 

    selectedImage = (UIImage *) [info valueForKey:UIImagePickerControllerEditedImage]; 
    if (selectedImage == nil) { 

     selectedImage= (UIImage *) [info valueForKey:UIImagePickerControllerOriginalImage]; 
     NSLog(@"Original image picked."); 

     } 
    else { 

     NSLog(@"Edited image picked."); 

     }  

    } 

    [picker dismissModalViewControllerAnimated:YES]; 


    [self.imageButton setImage:selectedImage forState:UIControlStateNormal]; 
} 

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 

    [self dismissModalViewControllerAnimated:YES]; 
} 
+0

Thanx a lottt ..你的答案對我來說就像一個魅力...... !!! – akshay 2014-01-07 09:18:30

相關問題