UIAlertView первый устаревший IOS 9
Я пробовал несколько способов использования UIAlertController вместо UIAlertView. Я пробовал несколько способов, но я не могу заставить действие оповещения работать. Вот мой код, который отлично работает в 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];
}
}
9 ответов:
от iOS8 Apple предоставляет новые
UIAlertController
класс, который вы можете использовать вместо UIAlertView, который теперь устарел, его также указано в сообщении об амортизацииUIAlertView является устаревшим. Используйте UIAlertController с preferredStyle из UIAlertControllerStyleAlert вместо
Так что вы должны использовать что-то вроде этого
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];
//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:^{ }]; }); }
Swift версия новой реализации:
let alert = UIAlertController(title: "Oops!", message:"your message", preferredStyle: .Alert) alert.addAction(UIAlertAction(title: "Okay.", style: .Default) { _ in }) self.presentViewController(alert, animated: true){}
Xcode 8 + Swift
предполагая, что
self
это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 } }
сделать 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.м
@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.м
[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]; }];
Примечание: Если вы хотите добавить более двух кнопок, добавьте еще одну больше UIAlertAction к UIAlertController.
используйте UIAlertController вместо 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]; }
Я пробовал вышеуказанные методы, и никто не может показать вид предупреждения, только когда я ставлю
presentViewController:
методdispatch_async
предложение:
dispatch_async(dispatch_get_main_queue(), ^ { [self presentViewController:alert animated:YES completion:nil]; });
смотрите альтернатива UIAlertView для iOS 9?.
проверить это:
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 { }
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];