iOS 9中的操作表问题

时间:2015-09-28 13:24:42

标签: ios9 uialertcontroller

Apple已弃用iOS 8.3中的操作表,如何向用户界面添加操作表?

我意识到Apple的文档在如何使用UIAlertController创建操作表方面不是很清楚。所以经过一段时间的游戏,我只是想分享我的代码,因为我无法在Stack Exchange上找到任何关于这个主题的有用信息。

3 个答案:

答案 0 :(得分:18)

我在我的iPhone应用程序中遇到了同样的问题,UIActionSheet询问用户是否要拍照,或者从他们的图库中选择图像。

enter image description here

在iOS 9之前,以下代码运行良好:

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

但是,在iOS 9中,所有这一切都会使屏幕变暗,并且不会出现任何内容。

是的...谢谢Apple。

解决方案是将UIActionSheet替换为UIAlertController

UIAlertController* alert = [UIAlertController
                            alertControllerWithTitle:nil      //  Must be "nil", otherwise a blank title area will appear above our two buttons
                            message:nil
                            preferredStyle:UIAlertControllerStyleActionSheet];

UIAlertAction* button0 = [UIAlertAction
                          actionWithTitle:@"Cancel"
                          style:UIAlertActionStyleCancel
                          handler:^(UIAlertAction * action)
                          {
                                //  UIAlertController will automatically dismiss the view
                          }];

UIAlertAction* button1 = [UIAlertAction
                          actionWithTitle:@"Take photo"
                          style:UIAlertActionStyleDefault
                          handler:^(UIAlertAction * action)
                          {
                              //  The user tapped on "Take a photo"
                              UIImagePickerController *imagePickerController= [[UIImagePickerController alloc] init];
                              imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
                              imagePickerController.delegate = self;
                              [self presentViewController:imagePickerController animated:YES completion:^{}];
                          }];

UIAlertAction* button2 = [UIAlertAction
                         actionWithTitle:@"Choose Existing"
                         style:UIAlertActionStyleDefault
                         handler:^(UIAlertAction * action)
                         {
                             //  The user tapped on "Choose existing"
                             UIImagePickerController *imagePickerController= [[UIImagePickerController alloc] init];
                             imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
                             imagePickerController.delegate = self;
                             [self presentViewController:imagePickerController animated:YES completion:^{}];
                         }];

[alert addAction:button0];
[alert addAction:button1];
[alert addAction:button2];
[self presentViewController:alert animated:YES completion:nil];

请注意,如果您包含取消选项(具有UIAlertActionStyleCancel样式的选项),则会显示操作表,但会点击操作表之外的任何位置< em>不会关闭菜单。

一件事:

尽管我们已经指定我们希望此UIAlertController具有样式UIAlertControllerStyleActionSheet,但您需要将标题设置为nil,而不是空字符串,否则您将获得窗户顶部有一个丑陋的缝隙。

enter image description here

我迫不及待地想看看iOS 9.2将会破坏什么完美的代码...

<强>更新

我的评论:“但是,在iOS 9中,所有这一切都会使屏幕变暗,并且不会出现任何内容”稍有不妥。

实际上,当屏幕键盘可见时,我正在打开UIActionSheet。在iOS 9中,键盘将显示在您的UIActionSheet 之上,因此您无法再看到您的操作表(!!),但是 看到屏幕的其余部分变暗了。

对于UIAlertController,iOS会更加用户友好,因为在尝试在屏幕底部显示操作表之前,隐藏屏幕键盘。究竟为什么Apple不会对UIActionSheets做同样的事情,这超出了我的范围。

(叹气。)

请问我现在可以回到使用Visual Studio吗?

另一次更新

Apple已经表示UIActionSheets现已“在iOS 8中被弃用”。

但是,如果你想继续使用它们,在包含文本框的iOS屏幕上,那么解决这个错误,错误,问题的方法是在显示UIActionSheet之前添加一行代码:

[self.view endEditing:true]; 

这可确保在显示“已弃用”操作表之前解除屏幕键盘的错误。

(叹气)如果有人需要我,我会在酒吧里。

答案 1 :(得分:5)

以下是我在我的应用中为操作表使用的代码片段,以防万一有人需要帮助,试图弄清楚如何将UIAlertController用作操作表。

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Action Sheet"
                                                                       message:@"This is an action sheet."
                                                                preferredStyle:UIAlertControllerStyleActionSheet];

        UIAlertAction *button1 = [UIAlertAction actionWithTitle:@"Button Title 1" style:UIAlertActionStyleDefault
                                                            handler:^(UIAlertAction * action) {
                                                                //code to run once button is pressed
                                                            }];
        UIAlertAction *button2 = [UIAlertAction actionWithTitle:@"Button Title 2" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
            //code to run once button is pressed
        }];

        [alert addAction:button1];
        [alert addAction:button2];
        [self presentViewController:alert animated:YES completion:nil];

答案 2 :(得分:1)

在iOS 9和iPad中,我不得不添加一些重要的更改。未来可能会有人需要这个。

    UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Server"
                                                                   message:@"Choose server to point to"
                                                            preferredStyle:UIAlertControllerStyleActionSheet];
    UIAlertAction *button1 = [UIAlertAction actionWithTitle:@"Development" style:UIAlertActionStyleDefault
                                                    handler:^(UIAlertAction * action) {
                                                        //code to run once button is pressed
                                                    }];
    UIAlertAction *button2 = [UIAlertAction actionWithTitle:@"Production" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        //code to run once button is pressed
    }];
    [alert addAction:button1];
    [alert addAction:button2];
    UIPopoverPresentationController *popPresenter = [alert popoverPresentationController];
    popPresenter.sourceView = self.view;
    //To present the actionsheet the bottom of screen
    popPresenter.sourceRect = CGRectMake(self.createBtn.frame.origin.x, self.view.frame.size.height, self.createBtn.frame.size.width, self.createBtn.frame.size.height);
    alert.modalPresentationStyle = UIModalPresentationPopover;
    [self presentViewController:alert animated:YES completion:nil];