UIAlertView 먼저 사용되지 않는 IOS 9


108

UIAlertView 대신 UIAlertController를 사용하는 여러 가지 방법을 시도했습니다. 여러 가지 방법을 시도했지만 경고 작업이 작동하지 않습니다. 다음은 IOS 8 및 IOS 9에서 잘 작동하지만 사용되지 않는 플래그로 표시되는 코드입니다. 아래의 우아한 제안을 시도했지만이 맥락에서 작동하도록 만들 수 없습니다. 앱을 제출해야하는데 이것이 마지막으로 해결해야 할 문제입니다. 추가 제안에 감사드립니다. 나는 초보자입니다.

#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
질문이 명확하지 않습니다. 당신이 원하는 것은 무엇입니까?
Moucheg

UIAlertView는 IOS 9에서 더 이상 사용되지 않으며 대신 UIAlertControllerStyleAlert의 preferredStyle과 함께 UIAlertController를 사용해야합니다. 그러나 UIAlertController 메서드를 사용할 때 경고가 표시되지 않습니다. 아래 해결책을 시도했지만 여전히 경고보기가 표시되지 않습니다 .. 감사합니다 ..
Bux

괜찮아. 당신이 한 일을 보여 주실 수 있습니까?
Moucheg 2015 년

1
프레젠테이션 후 [self dismissViewControllerAnimated : truecomplete : nil]을 호출합니다. 경고 컨트롤러를 해제합니다
Adnan Aftab 2015 년

1
이것은 UIAlertController가 꽤 새롭고 많은 개발자들이 지원 중단에 대해 걱정할 것이라는 점에서 중요한 질문입니다. 불합리한 반대표는 유효한 질문에 나쁜 영향을 미칩니다. 질문에 반대 투표 한 사람들은 편집 후 투표를 변경 했어야합니다. 그러나 그 다음, 자신의 반대표에 대한 배지를받은 "하위 표 트롤"은 어쨌든 이것을하지 않습니다. SO 중재자는 문제를 해결할 방법이 있어야합니다.
토토로

답변:


237

iOS8에서 Apple UIAlertController은 이제 더 이상 사용되지 않는 UIAlertView 대신 사용할 수있는 새 클래스를 제공하며 , 사용되지 않는 메시지에도 명시되어 있습니다.

UIAlertView는 더 이상 사용되지 않습니다. 대신 UIAlertControllerStyleAlert의 preferredStyle과 함께 UIAlertController를 사용하십시오.

그래서 다음과 같은 것을 사용해야합니다

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
빠른 답장을 보내 주셔서 감사합니다 .. 시도했지만 경고보기가 표시되지 않습니다 .. 제 예 제발 조치를 추가해도 표시되지 않습니다.
Bux

그 나를 위해 잘 작동하기 때문에 당신은 당신이 메인 스레드에서이 코드를 실행하는, 나에게 코드를 만든다 보여줄 수
아드 난 아프 탑을

질문 안에 코드를 추가 할 수 있습니까? 모든 사람이 볼 수있는 것이 더 좋을 것입니다
Adnan Aftab

안녕하세요, IOS8 및 IOS9에서 작동하는 전체 코드를 추가했지만 더 이상 사용되지 않는 플래그가 지정되었습니다. 코드를 구현하기 위해 여러 가지 방법을 시도했지만 경고가 표시되지 않고 상점 ViewController를 여는 작업이 작동하지 않습니다. 도와 주셔서 감사합니다.
Bux 2015 년

[alert dismissViewControllerAnimated:YES completion:nil];이 코드가 없으면 경고가 자동으로 숨겨 지므로 작업 처리기 에서이 줄을 제거하는 것이 좋습니다 . 또한 실행되지 않는 완료 블록에 실수로 코드를 넣을 수 있습니다. 건배 :)
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];
}

NSObject 클래스에서이 경고를 사용하려면 다음과 같이 사용해야합니다.

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

새로운 구현의 Swift 버전은 다음과 같습니다.

 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

가정 selfA는 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
    }
}

자기가 우리가 이것을 달성하는 방법을 본다면?.
Subin K Kuriakose

뷰는 비즈니스 로직을 수행하는 데 비즈니스가 없습니다. 컨트롤러가 뷰 (MVVM 또는 MVC)를 제공하도록 아키텍처를
재고합니다.

6

UIAlertController + AlertController 범주를 다음과 같이 만듭니다.

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

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

 }];

참고 : 두 개 이상의 버튼을 추가하려면 UIAlertController에 다른 UIAlertAction을 추가하십시오.


3

UIAlertView 대신 UIAlertController 사용

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

위의 방법을 시도했지만 아무도 경고보기를 표시 할 수 없습니다. presentViewController: 방법을 dispatch_async문장 에 .

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

iOS 9 용 UIAlertView의 대안을 참조하십시오 . .


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

이것을 확인하십시오 :

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]; // 메서드 호출

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.