UIAlertView đầu tiên không được chấp nhận trên IOS 9


108

Tôi đã thử một số cách để sử dụng UIAlertController, thay vì UIAlertView. Tôi đã thử một số cách nhưng không thể làm cho hành động cảnh báo hoạt động. Đây là mã của tôi hoạt động tốt trong IOS 8 và IOS 9 nhưng đang hiển thị với các cờ không được dùng nữa. Tôi đã thử gợi ý trang nhã bên dưới nhưng tôi không thể làm cho nó hoạt động trong ngữ cảnh này. Tôi cần gửi ứng dụng của mình và đây là điều cuối cùng cần giải quyết. Cảm ơn bạn cho bất kỳ đề xuất thêm. Tôi là một người mới.

#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
Câu hỏi không rõ ràng. Bạn muốn gì?
Moucheg

UIAlertView không được chấp nhận trong IOS 9 và chúng tôi phải sử dụng UIAlertController với UIAlertControllerStyleAlert được ưu tiên. Tuy nhiên, cảnh báo không hiển thị khi tôi sử dụng các phương pháp UIAlertController. Tôi đã thử giải pháp bên dưới, nhưng chế độ xem cảnh báo vẫn không hiển thị .. Cảm ơn bạn ..
Bux

Được chứ. Bạn có thể chỉ ra những gì bạn đã làm và điều đó không hiệu quả?
Moucheg

1
Sau khi trình bày, bạn đang gọi [self allowViewControllerAnimated: true complete: nil]; cái này sẽ loại bỏ bộ điều khiển cảnh báo
Adnan Aftab

1
Đây là một câu hỏi quan trọng vì UIAlertController còn khá mới và nhiều nhà phát triển sẽ lo lắng về việc không dùng nữa. Các phiếu giảm giá không hợp lý có ảnh hưởng xấu đến một câu hỏi hợp lệ. Những người bỏ phiếu cho câu hỏi lẽ ra đã thay đổi phiếu bầu của họ sau khi chỉnh sửa. Nhưng sau đó, "những kẻ phản đối bỏ phiếu", những người nhận được huy hiệu cho phiếu bầu của họ không làm điều này. Các nhà điều hành SO nên có một cách để sửa chữa nó.
Totoro

Câu trả lời:


237

Từ iOS8, Apple cung cấp UIAlertControllerlớp mới mà bạn có thể sử dụng thay cho UIAlertView hiện không được dùng nữa, nó cũng được nêu trong thông báo không dùng nữa:

UIAlertView không được dùng nữa. Sử dụng UIAlertController với Kiểu ưu tiên của UIAlertControllerStyleAlert thay thế

Vì vậy, bạn nên sử dụng một cái gì đó như thế này

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
Cảm ơn bạn đã trả lời nhanh .. Tôi đã thử điều này, nhưng chế độ xem cảnh báo không hiển thị .. Cũng không có khi tôi thêm hành động có xin vui lòng.
Bux

Bạn có thể chỉ cho tôi mã của bạn, bởi vì nó làm việc tốt cho tôi, hãy chắc chắn rằng bạn đang thực hiện mã này vào chủ đề chính
Adnan Aftab

bạn có thể thêm mã của bạn bên trong câu hỏi, đó sẽ là tốt hơn mọi người có thể thấy rằng
Adnan Aftab

Xin chào, tôi đã thêm mã hoàn chỉnh của mình hoạt động trong IOS8 và IOS9, nhưng bị gắn cờ không được dùng nữa. Tôi đã thử một số cách để triển khai mã của bạn nhưng cảnh báo không hiển thị và hành động để mở ViewController cửa hàng, sẽ không hoạt động. Cảm ơn sự giúp đỡ của bạn.
Bux

Tôi nghĩ tốt hơn nên xóa dòng này [alert dismissViewControllerAnimated:YES completion:nil];khỏi trình xử lý hành động vì cảnh báo sẽ tự động ẩn mà không cần mã này. Hơn nữa, người ta có thể đặt nhầm mã vào khối hoàn thành mà sẽ không được thực thi. Chúc mừng :)
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];
}

Nếu bạn muốn sử dụng cảnh báo này trong lớp NSObject, bạn nên sử dụng như:

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

Phiên bản Swift của triển khai mới là:

 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

Giả sử selflà một 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
    }
}

nếu tự xem làm thế nào chúng ta đạt được điều này ?.
Subin K Kuriakose

Một chế độ xem không có công việc kinh doanh, tốt, logic kinh doanh. Suy nghĩ lại kiến ​​trúc của bạn để bộ điều khiển hiển thị các chế độ xem (MVVM hoặc MVC)
SwiftArchitect

6

Tạo Danh mục UIAlertController + AlertController làm:

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

trong ViewController.m của bạn

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

 }];

LƯU Ý: Nếu bạn muốn thêm nhiều hơn hai nút thì hãy thêm một UIAlertAction khác vào UIAlertController.


3

Sử dụng UIAlertController thay vì 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

Tôi đã thử các phương pháp trên và không ai có thể hiển thị dạng xem cảnh báo, chỉ khi tôi đặt presentViewController:phương thức trong một dispatch_asynccâu:

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

Tham khảo Thay thế cho UIAlertView cho 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

Kiểm tra điều này:

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]; // phương thức gọi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.