UIAlertView pertama kali tidak digunakan lagi IOS 9

108

Saya telah mencoba beberapa cara untuk menggunakan UIAlertController, bukan UIAlertView. Saya mencoba beberapa cara tetapi saya tidak dapat membuat tindakan peringatan bekerja. Berikut adalah kode saya yang berfungsi dengan baik di IOS 8 dan IOS 9 tetapi muncul dengan tanda yang tidak berlaku lagi. Saya mencoba saran elegan di bawah ini tetapi saya tidak dapat membuatnya berfungsi dalam konteks ini. Saya perlu mengirimkan aplikasi saya dan ini adalah hal terakhir yang harus diatasi. Terima kasih atas saran lebih lanjut. Saya seorang pemula.

#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
sumber
1
Pertanyaan tidak jelas. Apa yang kamu inginkan?
Moucheg
UIAlertView tidak digunakan lagi di IOS 9 dan kita harus menggunakan UIAlertController dengan preferensiStyle dari UIAlertControllerStyleAlert sebagai gantinya. Namun, peringatan tidak muncul saat saya menggunakan metode UIAlertController. Saya mencoba solusi di bawah ini, tetapi tampilan peringatan tidak muncul .. Terima kasih ..
Bux
Baik. Dapatkah Anda menunjukkan apa yang telah Anda lakukan dan itu tidak berhasil?
Moucheg
1
Setelah presentasi, Anda memanggil [self rejectViewControllerAnimated: true complete: nil]; yang akan menutup pengontrol peringatan
Adnan Aftab
1
Ini adalah pertanyaan penting dalam arti bahwa UIAlertController cukup baru dan banyak pengembang akan khawatir tentang penghentian tersebut. Suara turun yang tidak masuk akal berdampak buruk pada pertanyaan yang valid. Mereka yang menolak untuk memilih pertanyaan tersebut seharusnya telah mengubah suara mereka setelah pengeditan. Tapi kemudian, "troll down vote" yang mendapatkan lencana karena down vote mereka tidak melakukannya. Moderator SO harus memiliki cara untuk memperbaikinya.
Totoro

Jawaban:

237

Dari iOS8 Apple menyediakan UIAlertControllerkelas baru yang dapat Anda gunakan sebagai pengganti UIAlertView yang sekarang sudah usang, itu juga dinyatakan dalam pesan penghentian:

UIAlertView tidak digunakan lagi. Gunakan UIAlertController dengan preferensiStyle dari UIAlertControllerStyleAlert sebagai gantinya

Jadi, Anda harus menggunakan sesuatu seperti ini

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
sumber
2
Terima kasih atas balasan cepat Anda .. Saya mencoba ini, tetapi tampilan peringatan tidak muncul .. Juga tidak ketika saya menambahkan tindakan ya tolong.
Bux
Dapatkah Anda menunjukkan kepada saya kode Anda, karena berfungsi dengan baik untuk saya, pastikan Anda menjalankan kode ini di utas utama
Adnan Aftab
dapatkah Anda menambahkan kode Anda di dalam pertanyaan, itu akan lebih baik setiap orang dapat melihat itu
Adnan Aftab
Hai, Saya menambahkan kode lengkap saya yang berfungsi di IOS8 dan IOS9, tetapi ditandai tidak berlaku lagi. Saya mencoba beberapa cara untuk mengimplementasikan kode Anda tetapi peringatan tidak muncul, dan tindakan untuk membuka toko ViewController, tidak akan berfungsi. Terima kasih untuk bantuannya.
Bux
Saya pikir lebih baik menghapus baris ini [alert dismissViewControllerAnimated:YES completion:nil];dari penangan tindakan, karena peringatan tersembunyi secara otomatis tanpa kode ini. Selain itu, seseorang dapat salah memasukkan kode di blok penyelesaian yang tidak akan dieksekusi. Salam :)
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];
}

Jika Anda ingin menggunakan peringatan ini di kelas NSObject, Anda harus menggunakan seperti:

-(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
sumber
14

Versi Swift dari implementasi baru adalah:

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

Xcode 8 + Swift

Dengan asumsi selfadalah 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
sumber
Jika diri adalah pandangan bagaimana kita mencapai ini?.
Subin K Kuriakose
Pandangan tidak ada urusannya, yah, logika bisnis. Pikirkan kembali arsitektur Anda sehingga pengontrol menyajikan tampilan (MVVM atau MVC)
SwiftArchitect
6

Jadikan UIAlertController + Kategori AlertController sebagai:

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

di ViewController.m Anda

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

 }];

CATATAN: Jika Anda ingin menambahkan lebih dari dua tombol, tambahkan lagi UIAlertAction ke UIAlertController.

Suhas Arvind Patil
sumber
3

Gunakan UIAlertController sebagai ganti 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
sumber
3

Saya mencoba metode di atas, dan tidak ada yang bisa menampilkan tampilan peringatan, hanya ketika saya meletakkan presentViewController:metode dalam dispatch_asynckalimat:

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

Lihat Alternatif ke UIAlertView untuk iOS 9? .

HongchaoZhang
sumber
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
sumber
0

Periksa ini:

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
sumber
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]; // memanggil Metode

Kishore Kumar
sumber