2012-03-25 2 views
0

Я пытаюсь использовать UIImagePickerController, чтобы захватить фотографию у пользователей Фотографии на их iPhone/iPad. Этот код отлично подходит для iPhone, но когда я запускаю его на iPad, отладчик дает мне сообщение «Завершение приложения из-за неперехваченного исключения« NSInvalidArgumentException », причина:« На iPad UIImagePickerController должен быть представлен через UIPopoverController ». Я очень новичок в Objective-C, поэтому я не знаю, как отредактировать этот код, чтобы использовать UIPopoverController, когда он запускается на iPad. Я бы предпочел не создавать 2 новых контроллера View, поэтому мне было интересно, знает ли кто, какой код мне нужно добавить, чтобы он работал как на iPhone, так и на iPad. Вот код в моих контроллерах зрения:iOS: UIImagePickerController Issue

ViewController.h:

@interface PhotoViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate> { 
     UIButton *grabButton; 
     UIImageView *image; 
     UIImagePickerController *imgPicker; 
    } 
    @property (strong, nonatomic) IBOutlet UIButton *grabButton; 
    @property (strong, nonatomic) IBOutlet UIImageView *image; 
    @property (strong, nonatomic) UIImagePickerController *imgPicker; 

    - (IBAction)grabImage; 

    @end 

ViewController.m:

#import "PhotoViewController.h" 


    @implementation PhotoViewController 
    @synthesize grabButton; 
    @synthesize image; 
    @synthesize imgPicker; 

    - (IBAction)grabImage { 
     [self presentModalViewController:self.imgPicker animated:YES]; 
    } 

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo { 
     image.image = img; 
     [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 
    } 

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
    { 
     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
     if (self) { 
      self.title = NSLocalizedString(@"Photo Gallery", @"Photo Gallery"); 
      self.tabBarItem.image = [UIImage imageNamed:@"42-photos.png"]; 
     } 
     return self; 
    } 

    - (void)viewDidLoad 
    { 
     self.imgPicker = [[UIImagePickerController alloc] init]; 
     self.imgPicker.allowsImageEditing = YES; 
     self.imgPicker.delegate = self; 
     self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     [super viewDidLoad]; 
    } 

Заранее спасибо!

ответ

2

Как Леголас уже упоминалось, в приложение IPad вы должны использовать UIPopOverController для того, чтобы представить imagePicker. Обычно я не поклонник наличия какого-либо кода в своем приложении, который выполняет задачи на основе типа устройства, но если вы не найдете лучшего решения, вы можете сделать следующее.

if ([[UIDevice currentDevice].model isEqual:@"iPad"]) 
{ 
    // Display image picker in a popover 
} 
else 
{ 
    // display imagePicker as a modal 
} 

Проверьте документацию для моделей устройств: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html

+0

Большое спасибо! Должен ли я добавить это в мой метод viewDidLoad? – John

+1

Да, вы можете сделать это на viewDidLoad – aryaxt

+0

попробуйте это: ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) – neoneye

6

У вас есть ответ на это сообщение об ошибке!

Использование UIPopOverController с UIImagePicker для iPad.

Если вы хотите знать, как использовать UIPopOverController, вы можете посмотреть на это tutorial!

Другой YouTube учебник - http://www.youtube.com/watch?v=6Gc3kxVwfmE

+0

Благодарим вас за ответ. Но я очень новичок в программировании, и эти учения проходят по моей голове. Мне просто интересно, какие изменения мне нужно внести в мой код, чтобы сделать его совместимым как для iPhone, так и для iPad. – John

+1

Извините, я только что вошел в систему ... Похоже, у вас есть ответ от @aryaxt :) Классный. – Legolas

+0

Его хороший человек благодарит за вашу помощь! У меня проблемы с его реализацией, но я решил, что было бы лучше создать другой вопрос вместо jam-pack. Еще раз спасибо! – John

0

Он работал для меня. Пожалуйста, попробуйте ниже код

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:self.imgpicker]; 
    popover.delegate =self; 
    [popover presentPopoverFromRect:self.view.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];}else{ 
[self presentModalViewController:self.imgpicker animated:YES]; 
} 
Смежные вопросы