UIAlertView najpierw przestarzałe IOS 9

108

Wypróbowałem kilka sposobów użycia UIAlertController zamiast UIAlertView. Wypróbowałem kilka sposobów, ale nie mogę sprawić, by działanie alarmowe zadziałało. Oto mój kod, który działa dobrze w IOS 8 i IOS 9, ale wyświetla się z przestarzałymi flagami. Wypróbowałem elegancką sugestię poniżej, ale nie mogę sprawić, by działała w tym kontekście. Muszę przesłać moją aplikację, a to ostatnia rzecz, którą należy się zająć. Dziękuję za dalsze sugestie. Jestem nowicjuszem.

#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
źródło
1
Pytanie nie jest jasne. Czego ty chcesz ?
Moucheg
UIAlertView jest przestarzały w IOS 9 i zamiast tego musimy używać UIAlertController z preferowanym stylem UIAlertControllerStyleAlert. Jednak alert nie jest wyświetlany, gdy używam metod UIAlertController. Wypróbowałem poniższe rozwiązanie, ale widok alertu nadal się nie wyświetla .. Dziękuję ..
Bux
W porządku. Czy możesz pokazać, co zrobiłeś, a to nie działa?
Moucheg
1
Po prezentacji wywołujesz [self discissViewControllerAnimated: prawdziwe zakończenie: zero]; co spowoduje zwolnienie kontrolera alertów
Adnana Aftaba
1
Jest to ważne pytanie w tym sensie, że UIAlertController jest całkiem nowy i wielu programistów będzie się martwić jego wycofaniem. Nierozsądne głosy negatywne mają zły wpływ na ważne pytanie. Ci, którzy odrzucili to pytanie, powinni byli zmienić swój głos po edycji. Ale wtedy „trolle z głosem negatywnym”, które otrzymają odznakę za swój głos negatywny, i tak tego nie robią. Moderatorzy SO powinni mieć sposób, aby to naprawić.
Totoro,

Odpowiedzi:

237

Od iOS8 Apple dostarcza nową UIAlertControllerklasę, której można używać zamiast UIAlertView, który jest obecnie przestarzały, jest to również określone w komunikacie o wycofaniu:

UIAlertView jest przestarzały. Zamiast tego użyj UIAlertController z preferowanym stylem UIAlertControllerStyleAlert

Więc powinieneś użyć czegoś takiego

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
źródło
2
Dziękuję za szybką odpowiedź. Próbowałem tego, ale widok alertu się nie wyświetla. Nie robi tego, kiedy dodam moje tak, proszę, działaj.
Bux
Czy możesz pokazać mi swój kod, ponieważ dla mnie działa dobrze, upewnij się, że wykonujesz ten kod w głównym wątku
Adnan Aftab
czy możesz dodać swój kod w pytaniu, byłoby lepiej, gdyby każdy mógł to zobaczyć
Adnan Aftab
Cześć, dodałem cały kod, który działa w IOS8 i IOS9, ale jest oznaczony jako przestarzały. Próbowałem na kilka sposobów zaimplementować Twój kod, ale alert się nie wyświetla, a czynność otwarcia sklepu ViewController nie będzie działać. Dziękuję za pomoc.
Bux
Myślę, że lepiej jest usunąć tę linię [alert dismissViewControllerAnimated:YES completion:nil];z programów obsługi akcji, ponieważ alert ukrywa się automatycznie bez tego kodu. Ponadto można omyłkowo umieścić kod w bloku uzupełniania, który nie zostanie wykonany. Pozdrawiam :)
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];
}

Jeśli chcesz użyć tego alertu w klasie NSObject, powinieneś użyć:

-(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
źródło
14

Szybka wersja nowej implementacji to:

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

Xcode 8 + Swift

Zakładając, że selfjest 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
źródło
jeśli jaźń jest poglądem, jak to osiągamy?
Subin K Kuriakose,
Widok nie ma sensu w wykonywaniu logiki biznesowej. Przemyśl swoją architekturę, aby kontroler przedstawiał widoki (MVVM lub MVC)
SwiftArchitect
6

Ustaw kategorię UIAlertController + AlertController jako:

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

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

 }];

UWAGA: Jeśli chcesz dodać więcej niż dwa przyciski, dodaj jeszcze jedną UIAlertAction do UIAlertController.

Suhas Arvind Patil
źródło
3

Użyj UIAlertController zamiast 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
źródło
3

Wypróbowałem powyższe metody i nikt nie może pokazać widoku alertu, tylko wtedy, gdy umieszczę presentViewController:metodę w dispatch_asynczdaniu:

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

Zobacz Alternatywa dla UIAlertView dla iOS 9? .

HongchaoZhang
źródło
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
źródło
0

Sprawdź to:

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
źródło
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]; // wywołanie metody

Kishore Kumar
źródło