如何关闭 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 的错误)
UINavigationController 作为 iPhone 上的弹出框?