如何关闭 iPhone 5 iOS 6 中的弹出框?

Posted

技术标签:

【中文标题】如何关闭 iPhone 5 iOS 6 中的弹出框?【英文标题】:How to dismiss a popover in iPhone 5 iOS 6? 【发布时间】:2013-07-12 19:34:36 【问题描述】:

当我的 iPhone 5 应用启动时,我没有显示视图控制器,原因如下:

- (void) viewDidAppear:(BOOL)animated 

用户要做的第一件事是触摸初始屏幕上的按钮 打开一个菜单,用于从用户的 照片库、相机或奥巴马的照片。用户触摸该按钮时调用的方法是:

- (IBAction) pickImage 
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Image Source"
    delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil
    otherButtonTitles:@"Photo Library", @"Camera", @"Obama", nil];
    [actionSheet showInView:scrollView];
    [actionSheet release];

现在 actionSheet 最终调用:

[self presentViewController:imagePicker animated:TRUE completion:nil]; 

对于 iPhone 5,一切正常,用户可以通过 presentViewController 获得 3 个选项。用户选择图像后,我会调用:

[[picker presentingViewController] dismissViewControllerAnimated:YES completion:nil];

视图控制器消失了。现在我想做的是让视图控制器最初出现,这样用户就不必通过向 viewDidAppear 方法添加一行来触摸连接到 pickImage 的按钮,如下所示:

- (void) viewDidAppear:(BOOL)animated 
    [self pickImage]; // makes the image picker pop up when app intializes

但是,当我对此进行测试时,imagePicker 会像我预期的那样自动显示,但是在我完成选择图像并将其关闭后,它会在我选择图像后重新出现。我该如何解决这个问题???

以下是我正在谈论的课程: MainViewController.h 文件:http://db.tt/Vgm3w0gs MainViewController.m 文件:http://db.tt/uN8YdNGN

或者你可以看看下面的相关方法:

- (void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex 

switch (buttonIndex) 
    case 0:  //photo library
        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) 
            UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
            imagePicker.delegate = self;
            imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            [self presentViewController:imagePicker animated:TRUE completion:nil];               
         else 
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Photo library is empty or unavailable" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alertView show];
        
        break;
    
            case 1: //camera option has it's view controller dismissed after image is taken. The rest of ActionSheet doesn't really matter...

HERE 是关闭 ViewController 的方法,除非从 viewDidAppear 中调用 imagePicker。问题:当从 viewDidAppear 中调用 imagePicker 时,如何让 viewController 关闭?

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
// loads image into main screen
[self loadImage:[info objectForKey:UIImagePickerControllerOriginalImage]];

    [[picker presentingViewController] dismissViewControllerAnimated:YES completion:nil];
   [picker release];

【问题讨论】:

我试图通过使用您的文件子集来重现您的问题,但它在 iphone 模拟器上运行良好,您的问题是仅在 iPad 上还是两者都存在? @gomino James 已经回答了我的问题,但感谢您的帮助! 好的没问题,还等什么奖励赏金? 【参考方案1】:

您当前的问题似乎是您希望在视图首次出现时调用pickImage,而不是在弹出窗口关闭后再次出现时调用。

一种可能是将pickImage 调用从viewDidAppear 回调移动到viewDidLoad 回调中。

但是,如果调用得太快,另一种选择是添加一个布尔变量,您可以在 viewDidAppear 中签入,以确保 pickImage 只被调用一次。

- (void) viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];
    if (firstAppearance) 
        firstAppearance = NO;
        [self pickImage];
    

并在 viewDidLoad 回调中将该布尔值设置为 true。

- (void) viewDidLoad 
    [super viewDidLoad];
    firstAppearance = YES;

显然,您还需要在头文件中的某处声明 bool。

BOOL firstAppearance;

【讨论】:

使用相机后,图像选择器正常关闭。问题是从照片库中选择图像后,将运行关闭它的图像选择器代码,但随后图像选择器重新出现,我不明白为什么。 @QuinnLiu 至少在 iPhone 上,代码应该是相同的——只是 sourceType 不同。但是考虑到它们是不同的控件,如果您使用的关闭代码适用于其中一个而不适用于另一个,那就不足为奇了。您是否真的尝试过我建议的代码(也假设您使用presentModalViewController 呈现界面)? 能否提供您的 .h 文件? @JamesHolderness 不幸的是它没有用,但感谢您的回复。 @YatinSaraiya 我已将原始 .h 和 .m 文件放入问题中,并在此处:db.tt/uN8YdNGN(.m 文件)和 db.tt/Vgm3w0gs(.h 文件)

以上是关于如何关闭 iPhone 5 iOS 6 中的弹出框?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的弹出框在 iPhone 6 Plus 上的 iOS 8.1 中崩溃? iOS 8 工作(实际上是 Xcode 6.0 到 6.1 的错误)

iPhone的弹出框控制器[关闭]

UINavigationController 作为 iPhone 上的弹出框?

iOS 5 中的弹出框变化?

iOS:关闭使用界面生成器生成的弹出框,并在弹出框内使用按钮

分享iOS功能界面漂亮的弹出框