UIAlertView veraltete zuerst IOS 9


108

Ich habe verschiedene Möglichkeiten ausprobiert, UIAlertController anstelle von UIAlertView zu verwenden. Ich habe verschiedene Möglichkeiten ausprobiert, aber ich kann die Alarmaktion nicht zum Laufen bringen. Hier ist mein Code, der unter IOS 8 und IOS 9 einwandfrei funktioniert, aber mit veralteten Flags angezeigt wird. Ich habe den eleganten Vorschlag unten ausprobiert, kann ihn aber in diesem Zusammenhang nicht zum Funktionieren bringen. Ich muss meine App einreichen und dies ist das Letzte, was ich ansprechen muss. Vielen Dank für weitere Vorschläge. Ich bin ein Neuling.

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

        }

}

1
Frage nicht klar. Was willst du ?
Moucheg

UIAlertView ist in IOS 9 veraltet und wir müssen stattdessen UIAlertController mit einem bevorzugten Stil von UIAlertControllerStyleAlert verwenden. Die Warnung wird jedoch nicht angezeigt, wenn ich UIAlertController-Methoden verwende. Ich habe die unten stehende Lösung ausprobiert, aber die Warnansicht wird immer noch nicht angezeigt. Vielen Dank.
Bux

In Ordnung. Können Sie zeigen, was Sie getan haben und das funktioniert nicht?
Moucheg

1
Nach der Präsentation rufen Sie [self EntlassungViewControllerAnimated: true Vervollständigung: nil] auf; das wird Alarm Controller entlassen
Adnan Aftab

1
Dies ist eine wichtige Frage in dem Sinne, dass UIAlertController ziemlich neu ist und viele Entwickler über die Ablehnung besorgt sein werden. Die unvernünftigen Abstimmungen wirken sich negativ auf eine gültige Frage aus. Diejenigen, die die Frage abgelehnt haben, sollten ihre Stimme nach der Bearbeitung geändert haben. Aber "Down-Vote-Trolle", die ein Abzeichen für ihre Down-Vote erhalten, tun dies sowieso nicht. Die SO-Moderatoren sollten eine Möglichkeit haben, dies zu beheben.
Totoro

Antworten:


237

Ab iOS8 bietet Apple eine neue UIAlertControllerKlasse an, die Sie anstelle von UIAlertView verwenden können, das jetzt veraltet ist. Dies wird auch in der Verfallsmeldung angegeben:

UIAlertView ist veraltet. Verwenden Sie stattdessen UIAlertController mit einem bevorzugten Stil von UIAlertControllerStyleAlert

Sie sollten also so etwas verwenden

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

2
Vielen Dank für Ihre schnelle Antwort. Ich habe es versucht, aber die Warnansicht wird nicht angezeigt. Auch nicht, wenn ich meine Ja-Bitte-Aktion hinzufüge.
Bux

Können Sie mir Ihren Code zeigen, weil er für mich gut funktioniert? Stellen Sie sicher, dass Sie diesen Code im Hauptthread ausführen
Adnan Aftab

Können Sie Ihren Code in Frage hinzufügen, das wäre besser, jeder kann das sehen
Adnan Aftab

Hallo, ich habe meinen vollständigen Code hinzugefügt, der unter IOS8 und IOS9 funktioniert, aber als veraltet markiert ist. Ich habe verschiedene Möglichkeiten ausprobiert, um Ihren Code zu implementieren, aber die Warnung wird nicht angezeigt, und die Aktion zum Öffnen des ViewController-Speichers funktioniert nicht. Danke für Ihre Hilfe.
Bux

Ich denke, es ist besser, diese Zeile [alert dismissViewControllerAnimated:YES completion:nil];aus den Aktionshandlern zu entfernen , da die Warnung ohne diesen Code automatisch ausgeblendet wird. Außerdem kann man fälschlicherweise Code in den Vervollständigungsblock einfügen, der nicht ausgeführt wird. Prost :)
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];
}

Wenn Sie diese Warnung in der NSObject-Klasse verwenden möchten, sollten Sie Folgendes verwenden:

-(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:^{
    }];
});
}

14

Die schnelle Version der neuen Implementierung lautet:

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

11

Xcode 8 + Swift

Angenommen, selfist ein 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
    }
}

Wenn Selbst ist Ansicht, wie wir dies erreichen?
Subin K Kuriakose

Eine Ansicht hat nichts mit der Geschäftslogik zu tun. Überdenken Sie Ihre Architektur, so dass ein Controller Ansichten (MVVM oder MVC) präsentiert
SwiftArchitect

6

Machen Sie UIAlertController + AlertController Kategorie als:

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

 }];

HINWEIS: Wenn Sie mehr als zwei Schaltflächen hinzufügen möchten, fügen Sie dem UIAlertController eine weitere UIAlertAction hinzu.


3

Verwenden Sie UIAlertController anstelle von 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];
}

3

Ich habe die oben genannten Methoden ausprobiert, und niemand kann die Warnansicht nur anzeigen, wenn ich die presentViewController:Methode in einen dispatch_asyncSatz setze :

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

Siehe Alternative zu UIAlertView für iOS 9? .


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

0

Überprüfen Sie dies:

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 

{

}

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]; // Methode aufrufen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.