如何使用UIAlertController替换UIActionSheet?

Don*_*hen 51 objective-c uiactionsheet ios uialertcontroller

我正在维护一个基于SDK 6.0的旧iOS项目.

这个项目的方法称为

-(void) showComboBox:(UIView*)view:withOptions:(NSDictionary*)options

用于显示组合框.为了实现这一目标,它使用了UIActionSheet,这在iOS8上已弃用.

我的解决方案是这样的:

        if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber10_8) {
        UIAlertController* alertController = [UIAlertController 
           alertControllerWithTitle:@"title" 
           message:@"message" 
           preferredStyle:UIAlertControllerStyleActionSheet];

        UIAlertAction* item = [UIAlertAction actionWithTitle:@"item" 
           style:UIAlertActionStyleDefault 
           handler:^(UIAlertAction *action) {
            //do something here 
            //inform the selection to the WebView 
            ...
            [alertController dismissViewControllerAnimated:YES completion:nil];
        }];

        UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
            [alertController dismissViewControllerAnimated:YES completion:nil];
        }];

        [alertController addAction:item];
        [alertController addAction:cancelAction];
        //I am not sure whether it's the right way
        if ([view.nextResponder isKindOfClass:UIViewController.class]) {
            UIViewController* vc = (UIViewController*)view.nextResponder;
            [vc presentViewController:alertController animated:YES completion:nil];
        }
Run Code Online (Sandbox Code Playgroud)

这是一个合适的解决方案?

这是我最关心的问题:UIAlertController需要添加到UIViewController但我只能获得UIView的指针,所以我使用view.nextResponder来获得我想要的东西,但这是一个好方法吗?

Kam*_*pai 71

我使用以下代码来显示使用的动作表UIAlertViewController,它完美无缺.

let alert = UIAlertController(title: "Action Title", message: "Action Message", preferredStyle: .actionSheet)
let action = UIAlertAction(title: "Item", style: .default) {
    UIAlertAction in
    // Write your code here
}
alert.addAction(action)

let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) {
    UIAlertAction in
    // It will dismiss action sheet
}
alert.addAction(cancelAction)
self.present(alert, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

编辑:

你需要在UIViewController这里获得对象.您可以设置全局变量或调用委托方法,也可以使用通知来获取此代码中的视图控制器对象.

以上代码中的最后一行就像.

- (IBAction)buttonClicked:(id)sender {

    UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:@"Action Sheet" message:@"Using the alert controller" preferredStyle:UIAlertControllerStyleActionSheet];

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

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

    [actionSheet addAction:[UIAlertAction actionWithTitle:@"Delete" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {

        // Distructive button tapped.
        [self dismissViewControllerAnimated:YES completion:^{
        }];
    }]];

    [actionSheet addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {

        // OK button tapped.

        [self dismissViewControllerAnimated:YES completion:^{
        }];
    }]];

    // Present action sheet.
    [self presentViewController:actionSheet animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)

self.viewController 是一个全局变量,它将在您实际获得此视图之前设置.

因为您现在正在使用的方法view.nextResponder.我担心它可能不起作用.

  • @Kampai感谢您的回答.它非常简单易懂.它节省了我的时间. (2认同)

小智 29

我用动作表来改变个人资料图片.我按照Kampai的方法,刚刚删除了dismissviewController调用,因为它在按下取消或照片选择视图时将我踢出视图

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

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

    // Cancel button tappped do nothing.

}]];

[actionSheet addAction:[UIAlertAction actionWithTitle:@"Take photo" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {

    // take photo button tapped.
    [self takePhoto];

}]];

[actionSheet addAction:[UIAlertAction actionWithTitle:@"Choose photo" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {

    // choose photo button tapped.
    [self choosePhoto];

}]];

[actionSheet addAction:[UIAlertAction actionWithTitle:@"Delete Photo" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {

    // Distructive button tapped.
    [self deletePhoto];

}]];
Run Code Online (Sandbox Code Playgroud)


Sau*_*dav 14

Swift更新 -

    let actionSheet = UIAlertController.init(title: "Please choose a source type", message: nil, preferredStyle: .actionSheet)
    actionSheet.addAction(UIAlertAction.init(title: "Take Photo", style: UIAlertActionStyle.default, handler: { (action) in
        self.openCamera()
    }))
    actionSheet.addAction(UIAlertAction.init(title: "Choose Photo", style: UIAlertActionStyle.default, handler: { (action) in
        self.showPhotoLibrary()
    }))
    actionSheet.addAction(UIAlertAction.init(title: "Cancel", style: UIAlertActionStyle.cancel, handler: { (action) in
        // self.dismissViewControllerAnimated(true, completion: nil) is not needed, this is handled automatically,
         //Plus whatever method you define here, gets called,
        //If you tap outside the UIAlertController action buttons area, then also this handler gets called.
    }))
    //Present the controller
    self.present(actionSheet, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)


Saz*_*han 5

斯威夫特4

        let alert = UIAlertController(title: "Select One", message: nil, preferredStyle: UIAlertControllerStyle.actionSheet)
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil))
        alert.addAction(UIAlertAction(title: "Export", style: UIAlertActionStyle.default, handler: { (action) in

            // TODO: Export wordlist

        }))
        alert.addAction(UIAlertAction(title: "Import", style: UIAlertActionStyle.default, handler: { (action) in

            // TODO: Import wordlist
        }))

        self.present(alert, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)