J'ai essayé plusieurs façons d'utiliser UIAlertController, au lieu de UIAlertView. J'ai essayé plusieurs méthodes mais je ne peux pas faire fonctionner l'action d'alerte. Voici mon code qui fonctionne bien dans IOS 8 et IOS 9 mais qui apparaît avec des indicateurs obsolètes. J'ai essayé la suggestion élégante ci-dessous mais je ne peux pas la faire fonctionner dans ce contexte. Je dois soumettre mon application et c'est la dernière chose à régler. Merci pour toutes autres suggestions. Je suis un novice.
#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];
}
}
Réponses:
À partir d'iOS8, Apple fournit une nouvelle
UIAlertController
classe que vous pouvez utiliser à la place de UIAlertView qui est maintenant obsolète, il est également indiqué dans le message d'obsolescence:Donc vous devriez utiliser quelque chose comme ça
la source
[alert dismissViewControllerAnimated:YES completion:nil];
des gestionnaires d'actions, car l'alerte se cache automatiquement sans ce code. De plus, on peut par erreur mettre du code dans le bloc de complétion qui ne sera pas exécuté. Cheers :)Si vous souhaitez utiliser cette alerte dans la classe NSObject, vous devez utiliser comme:
la source
La version Swift de la nouvelle implémentation est:
la source
Xcode 8 + Swift
En supposant que
self
c'estUIViewController
:la source
UIAlertController + AlertController.h
UIAlertController + AlertController.m
dans votre ViewController.m
la source
Utilisez UIAlertController au lieu de UIAlertView
la source
J'ai essayé les méthodes ci-dessus et personne ne peut afficher la vue d'alerte, uniquement lorsque je mets la
presentViewController:
méthode dans unedispatch_async
phrase:dispatch_async(dispatch_get_main_queue(), ^ { [self presentViewController:alert animated:YES completion:nil]; });
Reportez-vous à Alternative à UIAlertView pour iOS 9? .
la source
la source
Vérifie ça:
la source
[self showAlert];
// méthode d'appella source