UIAlertView first deprecated IOS 9
Solution 1
From iOS8 Apple provide new UIAlertController
class which you can use instead of UIAlertView which is now deprecated, it is also stated in deprecation message:
UIAlertView is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert instead
So you should use something like this
UIAlertController * alert = [UIAlertController
alertControllerWithTitle:@"Title"
message:@"Message"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* yesButton = [UIAlertAction
actionWithTitle:@"Yes, please"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
//Handle your yes please button action here
}];
UIAlertAction* noButton = [UIAlertAction
actionWithTitle:@"No, thanks"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
//Handle no, thanks button
}];
[alert addAction:yesButton];
[alert addAction:noButton];
[self presentViewController:alert animated:YES completion:nil];
Solution 2
//Calling
[self showMessage:@"There is no internet connection for this device"
withTitle:@"Error"];
//Method
-(void)showMessage:(NSString*)message withTitle:(NSString *)title
{
UIAlertController * alert= [UIAlertController
alertControllerWithTitle:title
message:message
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
//do something when click button
}];
[alert addAction:okAction];
UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
[vc presentViewController:alert animated:YES completion:nil];
}
If you want to use this alert in NSObject class you should use like:
-(void)showMessage:(NSString*)message withTitle:(NSString *)title{
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}]];
[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentViewController:alertController animated:YES completion:^{
}];
});
}
Solution 3
Swift version of new implementation is :
let alert = UIAlertController(title: "Oops!", message:"your message", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Okay.", style: .Default) { _ in })
self.presentViewController(alert, animated: true){}
Solution 4
Xcode 8 + Swift
Assuming self
is a UIViewController
:
func displayAlert() {
let alert = UIAlertController(title: "Test",
message: "I am a modal alert",
preferredStyle: .alert)
let defaultButton = UIAlertAction(title: "OK",
style: .default) {(_) in
// your defaultButton action goes here
}
alert.addAction(defaultButton)
present(alert, animated: true) {
// completion goes here
}
}
Solution 5
Make UIAlertController+AlertController Category as:
UIAlertController+AlertController.h
typedef void (^UIAlertCompletionBlock) (UIAlertController *alertViewController, NSInteger buttonIndex);
@interface UIAlertController (AlertController)
+ (instancetype)showAlertIn:(UIViewController *)controller
WithTitle:(NSString *)title
message:(NSString *)message
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSString *)otherButtonTitle
tapBlock:(UIAlertCompletionBlock)tapBlock;
@end
UIAlertController+AlertController.m
@implementation UIAlertController (NTAlertController)
+ (instancetype)showAlertIn:(UIViewController *)controller
WithTitle:(NSString *)title
message:(NSString *)message
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSString *)otherButtonTitle
tapBlock:(UIAlertCompletionBlock)tapBlock {
UIAlertController *alertController = [self alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
if(cancelButtonTitle != nil) {
UIAlertAction *cancelButton = [UIAlertAction
actionWithTitle:cancelButtonTitle
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action)
{
tapBlock(alertController, ALERTACTION_CANCEL); // CANCEL BUTTON CALL BACK ACTION
}];
[alertController addAction:cancelButton];
}
if(otherButtonTitle != nil) {
UIAlertAction *otherButton = [UIAlertAction
actionWithTitle:otherButtonTitle
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action)
{
tapBlock(alertController, ALERTACTION_OTHER); // OTHER BUTTON CALL BACK ACTION
}];
[alertController addAction:otherButton];
}
[controller presentViewController:alertController animated:YES completion:nil];
return alertController;
}
@end
in your ViewController.m
[UIAlertController showAlertIn:self WithTitle:@"" message:@"" cancelButtonTitle:@"Cancel" otherButtonTitles:@"Other" tapBlock:^(UIAlertController *alertController, NSInteger index){
if(index == ALERTACTION_CANCEL){
// CANCEL BUTTON ACTION
}else
if(index == ALERTACTION_OTHER){
// OTHER BUTTON ACTION
}
[alertController dismissViewControllerAnimated:YES completion:nil];
}];
NOTE: If you want to add more than two buttons then add another more UIAlertAction to the UIAlertController.
Related videos on Youtube
Bux
Day job: I consult from home as an Organic Petrologist and basin modeller in earth science; spending hours looking down a microscope. I used to specialise in writing code to control instruments like mass spectrometers and gas chromatographs etc.. Spare time: I am an illustrator and children's book author. I am learning to combine my art with my love of code as a creative outlet. Living everyday like it's my last!
Updated on November 11, 2021Comments
-
Bux over 2 years
I have tried several ways to use UIAlertController,instead of UIAlertView. I tried several ways but I cannot make the alert action work. Here is my code that works fine in IOS 8 and IOS 9 but is showing up with deprecated flags. I tried the elegant suggestion below but I can't make it function in this context. I need to submit my app and this is the last thing to address. Thank You for any further suggestions. I am a newbie.
#pragma mark - BUTTONS ================================ - (IBAction)showModesAction:(id)sender { NSLog(@"iapMade: %d", iapMade3); // IAP MADE ! =========================================== if (!iapMade3) { //start game here gamePlaysCount++; [[NSUserDefaults standardUserDefaults]setInteger:gamePlaysCount forKey:@"gamePlaysCount"]; NSLog(@"playsCount: %ld", (long)gamePlaysCount); if (gamePlaysCount >= 4) { UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Basic" message: THREE_PLAYS_LIMIT_MESSAGE delegate:self cancelButtonTitle:@"Yes, please" otherButtonTitles:@"No, thanks", nil]; [alert show]; NSString *path = [[NSBundle mainBundle] pathForResource:@"cow" ofType:@"wav"]; _pop =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; [_pop play]; [self dismissViewControllerAnimated:true completion:nil]; } else { if (gamePlaysCount == 1) { // Create & store the next 5 mins when player gets 3 more lives nextDateToPlay = [[NSDate date] dateByAddingTimeInterval:60*60*0.1]; NSLog(@"CURRENT DATE: %@", [NSDate date]); NSLog(@"NEXT DAY: %@", nextDateToPlay); [[NSUserDefaults standardUserDefaults]setObject: nextDateToPlay forKey:@"nextDateToPlay"]; NSLog(@"nextDateToPlay: %@", nextDateToPlay); UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Basic" message: THREE_PLAYS_LIMIT_MESSAGE2 delegate:self cancelButtonTitle:@"Got it!" otherButtonTitles:@"Start", nil]; [alert show]; } else { if (gamePlaysCount == 3) { UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Basic" message: THREE_PLAYS_LIMIT_MESSAGE3 delegate:self cancelButtonTitle:@"Yep, I Know!" otherButtonTitles:@"Start", nil]; [alert show]; } } } } } // IAP NOT MADE ============================= #pragma mark - ALERTVIEW DELEGATE ============================ -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:@"Yes, please"]) { UIStoryboard *storyboard = self.storyboard; MenuViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"Store"]; svc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self presentViewController:svc animated:YES completion:nil]; } }
-
Moumou over 8 yearsQuestion not clear. What is it that you want ?
-
Bux over 8 yearsUIAlertView is deprecated in IOS 9 and we have to use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert instead. However, the alert does not show when I use UIAlertController methods. I tried the solution below, but still the alert view does not show.. Thank you..
-
Moumou over 8 yearsOkay. Can you show what you have done and that doesn't work ?
-
Adnan Aftab over 8 yearsAfter presenting you are calling [self dismissViewControllerAnimated:true completion:nil]; which will dismiss alert controller
-
Bux over 8 yearsYes.. I pasted the old code and pressed the tab button while editing message. I am new to Stack ... I still cannot get my code to work correctly with the UIAlertController class. My Complete code is:
-
Totoro over 8 yearsThis is an important question in the sense that UIAlertController is pretty new and many developers will be worried about the deprecation. The unreasonable down votes have bad effect on a valid question. Those who down voted the question should have changed their vote after the edit. But then,"down vote trolls" who get a badge for their down vote do not do this anyway. The SO moderators should have a way to fix it.
-
Naresh over 4 years
-
-
Bux over 8 yearsThank you for your fast reply.. I tried this, but the alert view does not show.. Nor does it when I add my yes please action.
-
Adnan Aftab over 8 yearsCan you show me your code, because its working fine for me, make sure you are executing this code on main thread
-
Adnan Aftab over 8 yearscan you add your code inside question, that would be better every one can see that
-
Bux over 8 yearsHi, I added my complete code that works in IOS8 and IOS9, but is flagged deprecated. I tried several ways to implement your code but the alert does not show, and the action to open the store ViewController, will not function. Thank you for your help.
-
stellz over 8 yearsI think it's better to remove this line
[alert dismissViewControllerAnimated:YES completion:nil];
from the actions handlers, because the alert hides automatically without this code. Moreover, one can mistakenly put code in the completion block which will not be executed. Cheers :) -
vignesh kumar about 8 yearsBut In older UIAlertView I can show them in whatever place I wish to show, But Here I need a UIViewController to display the alert
-
Ali Beadle almost 8 years@vignesh kumar if you want to use the new theme outside of a view controller use: UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(...)
-
vignesh kumar almost 8 years@AliBeadle Thanks for the reply.just asking as I am handling an old project in which they show uialert from uitableviewcell (even thought it is bad way)
-
Subin K Kuriakose about 7 yearsif self is view how we achieve this ?.
-
SwiftArchitect about 7 yearsA view has no business in doing, well, the business logic. Rethink your architecture so that a controller presents views (MVVM or MVC)
-
Steve A over 2 yearsThis is simply a repost of @Adnan Aftab's post.