2013-02-18 86 views
1

我有下面的代碼來加載UIImagePickerController,它工作正常。在UIImagePickerController之前添加UIViewController

UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init]; 
    mediaUI.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
    mediaUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil]; 
    mediaUI.delegate = self; 
    [controller presentModalViewController: mediaUI animated: YES]; 
    return YES; 

我想加載一個模式的看法與如何使用的UIImagePickerController一些幫助信息:

UIStoryboard *storyboard = self.storyboard; 
HelpViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"HelpViewController"]; 
[self presentViewController:svc animated:YES completion:nil]; 

我怎麼能顯示的UIImagePickerController用戶退出HelpViewController視圖後?

+0

我不知道它是否工作解僱和使用presentviewcontroller後。你可以加載模型視圖來幫助信息和一些動作按鈕,例如,你可以再次使用presentviewcontroller去下一個viewcontroller ......並且當你從這兩個視圖都不去任何實用工具時,只需要放棄視圖控制器...你也可以創建一個導航控制器.. – 2013-02-18 00:49:38

回答

3

不要試圖直接從HelpViewController移動到UIImagePickerController,你需要通過你的mainViewController來到那裏。

讓我們把你的代碼放到一個方法......

- (void) presentImagePicker { 
    UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init]; 
    mediaUI.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
    mediaUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil]; 
    mediaUI.delegate = self; 
    [controller presentModalViewController: mediaUI animated: YES]; 
    return YES; 
} 

(注意,因爲〜iOS5的是presentModalViewController:animated是depracated,你真的應該用 [controller presentViewController:mediaUI animated:YES completion:nil];更換)

讓我們把你的viewControllers mainVChelpVCimageVC。有兩種方法可以實現這一點。

方法1 - performSelector

的快速和稍髒的解決方案是要做到這一點你helpVC的解僱按鈕方法:

- (IBAction)dismissHelpAndPresentImagePicker:(id)sender 
{ 
    UIViewController* mainVC = self.presentingViewController; 
    [mainVC dismissViewControllerAnimated:NO completion: 
    ^{ 
     if ([mainVC respondsToSelector:@selector(presentImagePicker)]) 
     [mainVC performSelector:@selector(presentImagePicker)]; 
    }]; 
} 

這是輕度污染,因爲你需要確保presentImagePickermainVC實施 - 編譯器會給你任何警告,如果它不是。另外你正在運行它的對象後完成塊已被開除,所以沒有把握它去上班(在實踐中,確實如此,但仍...)

請注意,您分配指針自.presentingViewController的本地變量(mainVC)。這是因爲當helpVC被解僱時,它的presentingViewController屬性重置爲零,所以當你運行完成塊時,你不能使用它。但局部變量mainVC仍然有效。

方法2 - 協議/委託

的清潔方式做到這一點是利用一個協議在helpVC聲明一個委託方法,使mainVC委託。通過這種方式,編譯器將跟蹤所有內容並警告您是否未正確實施。

下面是步驟做到這一點:

在helpVC.h添加@interface部高於該協議:

@protocol helpVCDelegate 
    - (void) dismissHelpAndPresentImagePicker; 
@end 

在helpVC。ħ接口部分聲明一個屬性爲其代表:

@property (nonatomic, weak) id <helpVCDelegate> delegate; 

(該<helpVCDelegate>告訴該委託預期符合協議的編譯器,因此它必須實現dismissHelpAndPresentImagePicker

在helpVC.m你的方法現在可以是這樣的:

- (IBAction)dismissHelpAndPresentImagePicker:(id)sender 
{ 
    [self.delegate dismissHelpAndPresentImagePicker]; 
} 

在MainVC,當您創建HelpVC(在你的代碼 = SVC),設置MainVC因爲它的委託:

HelpViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"HelpViewController"]; 
svc.delegate = self; 
[self presentViewController:svc animated:YES completion:nil]; 

而且一定要實現委託方法dismissHelpAndPresentImagePicker

- (void) dismissHelpAndPresentImagePicker 
{ 
    [self dismissViewControllerAnimated:NO completion:^{ 
      [self presentImagePicker]; 
     }]; 

} 

我個人一直使用方法2,但我一個今天的解決方案早些時候提供了多達a similar question,並提問似乎認爲協議/代表過於複雜。也許我的回答就是這樣,我試圖在這裏簡化它。

+0

@DD謝謝你接受我的回答,但我注意到了一個錯誤 - 我們沒有明確解僱委託版本中的HelpVC ......我已經更新了它。 – foundry 2013-02-18 11:10:16

+0

@DD - 再次更新...'presentImagePicker'在一個完成塊中效果更好,所以直到'dimissViewController'完成解散後纔會觸發它。 – foundry 2013-02-20 03:12:25

+0

我用「髒」的方法從一個在tabarcontroller中的uiview中調用imagepickercontroller - 非常好用 - 謝謝! – 2014-12-22 18:29:05