Apple已弃用iOS 8.3中的操作表,如何向用户界面添加操作表?
我意识到Apple的文档在如何使用UIAlertController创建操作表方面不是很清楚。所以经过一段时间的游戏,我只是想分享我的代码,因为我无法在Stack Exchange上找到任何关于这个主题的有用信息。
答案 0 :(得分:18)
我在我的iPhone应用程序中遇到了同样的问题,UIActionSheet
询问用户是否要拍照,或者从他们的图库中选择图像。
在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
,而不是空字符串,否则您将获得窗户顶部有一个丑陋的缝隙。
我迫不及待地想看看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];