How to use UIAlertController to replace UIActionSheet? How to use UIAlertController to replace UIActionSheet? ios ios

How to use UIAlertController to replace UIActionSheet?


I have used following code to show action sheet using UIAlertViewController and it works perfect.

Swift

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)

Objective C

- (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];}

Edit:

You need to get UIViewController object here. You can set global variable or call a delegate method, or you can use notification to get view controller object in this code.

and last line in above code will be like.

[self.viewController presentViewController:actionSheet animated:YES completion:nil];

self.viewController is a global variable which will be set before you actually get this view.

Because the approach you are following now using view.nextResponder. I'm afraid that it may not work.


I have used action sheet for changing profile picture. I followed Kampai approach, just removed dismissviewController call since it was kicking me out of a view when pressing Cancel or photo selection view

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];}]];


Swift update -

    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)