UIAlertView premier IOS 9 obsolète

108

J'ai essayé plusieurs façons d'utiliser UIAlertController, au lieu de UIAlertView. J'ai essayé plusieurs méthodes mais je ne peux pas faire fonctionner l'action d'alerte. Voici mon code qui fonctionne bien dans IOS 8 et IOS 9 mais qui apparaît avec des indicateurs obsolètes. J'ai essayé la suggestion élégante ci-dessous mais je ne peux pas la faire fonctionner dans ce contexte. Je dois soumettre mon application et c'est la dernière chose à régler. Merci pour toutes autres suggestions. Je suis un novice.

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

        }

}
Bux
la source
1
Question pas claire. Qu'est-ce que vous voulez ?
Moucheg le
UIAlertView est obsolète dans IOS 9 et nous devons utiliser UIAlertController avec un style préféré de UIAlertControllerStyleAlert à la place. Cependant, l'alerte ne s'affiche pas lorsque j'utilise les méthodes UIAlertController. J'ai essayé la solution ci-dessous, mais la vue d'alerte ne s'affiche toujours pas .. Merci ..
Bux
D'accord. Pouvez-vous montrer ce que vous avez fait et cela ne fonctionne pas?
Moucheg
1
Après la présentation, vous appelez [self ignoreViewControllerAnimated: true completion: nil]; qui rejettera le contrôleur d'alerte
Adnan Aftab
1
C'est une question importante dans le sens où UIAlertController est assez récent et de nombreux développeurs s'inquiéteront de la dépréciation. Les votes négatifs déraisonnables ont un effet négatif sur une question valide. Ceux qui ont voté contre la question auraient dû changer leur vote après la modification. Mais alors, les "trolls de vote à la baisse" qui obtiennent un badge pour leur vote à la baisse ne le font pas de toute façon. Les modérateurs SO devraient avoir un moyen de résoudre ce problème.
Totoro du

Réponses:

237

À partir d'iOS8, Apple fournit une nouvelle UIAlertControllerclasse que vous pouvez utiliser à la place de UIAlertView qui est maintenant obsolète, il est également indiqué dans le message d'obsolescence:

UIAlertView est obsolète. Utilisez UIAlertController avec un style préféré de UIAlertControllerStyleAlert à la place

Donc vous devriez utiliser quelque chose comme ça

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];
Adnan Aftab
la source
2
Merci pour votre réponse rapide. J'ai essayé ceci, mais la vue d'alerte ne s'affiche pas. Et quand j'ajoute mon oui s'il vous plaît, cela ne l'est pas non plus.
Bux
Pouvez-vous me montrer votre code, car cela fonctionne bien pour moi, assurez-vous que vous exécutez ce code sur le fil principal
Adnan Aftab
pouvez-vous ajouter votre code à l'intérieur de la question, ce serait mieux que tout le monde puisse le voir
Adnan Aftab
Salut, j'ai ajouté mon code complet qui fonctionne dans IOS8 et IOS9, mais est signalé comme obsolète. J'ai essayé plusieurs façons d'implémenter votre code mais l'alerte ne s'affiche pas et l'action d'ouverture du magasin ViewController ne fonctionnera pas. Merci de votre aide.
Bux
Je pense qu'il est préférable de supprimer cette ligne [alert dismissViewControllerAnimated:YES completion:nil];des gestionnaires d'actions, car l'alerte se cache automatiquement sans ce code. De plus, on peut par erreur mettre du code dans le bloc de complétion qui ne sera pas exécuté. Cheers :)
stellz
21
//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];
}

Si vous souhaitez utiliser cette alerte dans la classe NSObject, vous devez utiliser comme:

-(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:^{
    }];
});
}
Mannam Brahmam
la source
14

La version Swift de la nouvelle implémentation est:

 let alert = UIAlertController(title: "Oops!", message:"your message", preferredStyle: .Alert)
 alert.addAction(UIAlertAction(title: "Okay.", style: .Default) { _ in })
 self.presentViewController(alert, animated: true){}
Dashrath
la source
11

Xcode 8 + Swift

En supposant que selfc'est 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
    }
}
SwiftArchitect
la source
si le moi est de voir comment nous y parvenons?
Subin K Kuriakose
Une vue n'a pas à faire, eh bien, la logique métier. Repensez votre architecture pour qu'un contrôleur présente des vues (MVVM ou MVC)
SwiftArchitect
6

Définissez la catégorie UIAlertController + AlertController comme:

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

dans votre 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];

 }];

REMARQUE: si vous souhaitez ajouter plus de deux boutons, ajoutez un autre UIAlertAction à l'UIAlertController.

Suhas Arvind Patil
la source
3

Utilisez UIAlertController au lieu de UIAlertView

-(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];
}
Mahesh reddy
la source
3

J'ai essayé les méthodes ci-dessus et personne ne peut afficher la vue d'alerte, uniquement lorsque je mets la presentViewController:méthode dans une dispatch_asyncphrase:

dispatch_async(dispatch_get_main_queue(), ^ { [self presentViewController:alert animated:YES completion:nil]; });

Reportez-vous à Alternative à UIAlertView pour iOS 9? .

HongchaoZhang
la source
1
 UIAlertController * alert = [UIAlertController
                                 alertControllerWithTitle:@"Are you sure you want to logout?"
                                 message:@""
                                 preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* yesButton = [UIAlertAction
                                actionWithTitle:@"Logout"
                                style:UIAlertActionStyleDestructive
                                handler:^(UIAlertAction * action)
                                {

                                }];

    UIAlertAction* noButton = [UIAlertAction
                               actionWithTitle:@"Cancel"
                               style:UIAlertActionStyleDefault
                               handler:^(UIAlertAction * action) {
                                   //Handle no, thanks button
                               }];

    [alert addAction:noButton];
    [alert addAction:yesButton];

    [self presentViewController:alert animated:YES completion:nil];
Ishwar Hingu
la source
0

Vérifie ça:

UIAlertController *alertctrl =[UIAlertController alertControllerWithTitle:@"choose Image" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
    UIAlertAction *camera =[UIAlertAction actionWithTitle:@"camera" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        [self Action];  //call Action need to perform 
    }];

[alertctrl addAction:camera];
-(void)Action 

{

}
Sabby
la source
0
-(void)showAlert{

    UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Title"
                                                                   message:"Message"
                                                            preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                          handler:^(UIAlertAction * action) {}];

    [alert addAction:defaultAction];
    [self presentViewController:alert animated:YES completion:nil];
}

[self showAlert]; // méthode d'appel

Kishore Kumar
la source