• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 未调用dismissViewController 完成处理程序

[复制链接]
菜鸟教程小白 发表于 2022-12-13 13:56:15 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

尝试使用链接中第一个答案中的代码(由 Kampai 提供): How to use UIAlertController to replace UIActionSheet?

但是,我的代码中甚至没有调用完成处理程序。

按下两个按钮后可以关闭警报操作表,但完成处理程序内部没有任何作用。 知道可能是什么问题吗?我是使用完成处理程序的新手,并试图在网上找到答案,但很少有人遇到与我相同的问题。

- (IBAction)takePhotoButtonPressedUIButton *)sender {
pressedButtonTagNumber = sender.tag;

UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];

[actionSheet addAction:[UIAlertAction actionWithTitle"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {

    // Cancel button tappped
    [self dismissViewControllerAnimated:YES completion:^{
    }];
}]];

[actionSheet addAction:[UIAlertAction actionWithTitle"Take a Photo" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    NSLog(@"!");
    // Take a Photo button tapped
    [self dismissViewControllerAnimated:YES completion:^{
        NSLog(@"0"); // NOT CALLED
        // Initialize UIImagePickerController
        UIImagePickerController *takePhotoImagePickerController = [[UIImagePickerController alloc] init];            takePhotoImagePickerController.delegate = self;
        takePhotoImagePickerController.allowsEditing = YES;
        NSLog(@"1");
        // Check and assign image source
        if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
            NSLog(@"2");
            UIAlertController *noCameraErrorSheet = [UIAlertController alertControllerWithTitle"Camera is not available" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
            [noCameraErrorSheet addAction:[UIAlertAction actionWithTitle"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
                // Cancel button tappped
                [self dismissViewControllerAnimated:YES completion:^{
                }];
            }]];
        } else {
            takePhotoImagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
            // Present UIImagePickerController
            [self presentViewController:takePhotoImagePickerController animated:YES completion:NULL];
        }

    }];
}]];

解决方案:

@Paulw11 解决方案效果很好:

1) UIAlertController 不需要dismissViewController。 2)如果一个新的 UIAlertController 包装它正在解散(显然),则无法调用它。 3) 最好提前检查和禁用按钮。

UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];

[actionSheet addAction:[UIAlertAction actionWithTitle"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
}]];

UIAlertAction *takePhotoActionButton = [UIAlertAction actionWithTitle"Take Photo" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    [self takePhoto];
}];
UIAlertAction *uploadPhotoActionButton = [UIAlertAction actionWithTitle"Upload from Library" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    [self uploadPhoto];
}];

// Disable take a photo button if source not available
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
    [takePhotoActionButton setEnabled:FALSE];
}
// Disable upload a photo button if source not available
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
    [uploadPhotoActionButton setEnabled:FALSE];
}

[actionSheet addAction:takePhotoActionButton];
[actionSheet addAction:uploadPhotoActionButton];

// Present action sheet.
[self presentViewController:actionSheet animated:YES completion:nil];



Best Answer-推荐答案


您无需在操作处理程序中调用 dismissViewController:animated: 即可移除警报。 UIAlertController 在调用 Action 处理程序代码之前调用它来关闭自身。

在您的操作处理程序中,您只需执行选择该操作时应该执行的任何操作:

在这种情况下:

  • 在您的取消操作中,您无需执行任何操作
  • 在你的“拍照” Action 中你拍照

此外,从用户体验的角度来看,最好禁用“拍照”或在他们选择后立即显示警报,而不是在他们尝试拍照后发出警报;换句话说,早点而不是晚点指出问题

关于ios - 未调用dismissViewController 完成处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38908826/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap