Wypróbowałem kilka sposobów użycia UIAlertController zamiast UIAlertView. Wypróbowałem kilka sposobów, ale nie mogę sprawić, by działanie alarmowe zadziałało. Oto mój kod, który działa dobrze w IOS 8 i IOS 9, ale wyświetla się z przestarzałymi flagami. Wypróbowałem elegancką sugestię poniżej, ale nie mogę sprawić, by działała w tym kontekście. Muszę przesłać moją aplikację, a to ostatnia rzecz, którą należy się zająć. Dziękuję za dalsze sugestie. Jestem nowicjuszem.
#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];
}
}
Odpowiedzi:
Od iOS8 Apple dostarcza nową
UIAlertController
klasę, której można używać zamiast UIAlertView, który jest obecnie przestarzały, jest to również określone w komunikacie o wycofaniu:Więc powinieneś użyć czegoś takiego
źródło
[alert dismissViewControllerAnimated:YES completion:nil];
z programów obsługi akcji, ponieważ alert ukrywa się automatycznie bez tego kodu. Ponadto można omyłkowo umieścić kod w bloku uzupełniania, który nie zostanie wykonany. Pozdrawiam :)Jeśli chcesz użyć tego alertu w klasie NSObject, powinieneś użyć:
źródło
Szybka wersja nowej implementacji to:
źródło
Xcode 8 + Swift
Zakładając, że
self
jestUIViewController
:źródło
UIAlertController + AlertController.h
UIAlertController + AlertController.m
w Twoim ViewController.m
źródło
Użyj UIAlertController zamiast UIAlertView
źródło
Wypróbowałem powyższe metody i nikt nie może pokazać widoku alertu, tylko wtedy, gdy umieszczę
presentViewController:
metodę wdispatch_async
zdaniu:dispatch_async(dispatch_get_main_queue(), ^ { [self presentViewController:alert animated:YES completion:nil]; });
Zobacz Alternatywa dla UIAlertView dla iOS 9? .
źródło
źródło
Sprawdź to:
źródło
[self showAlert];
// wywołanie metodyźródło