edit
Właśnie sobie przypomniałem inny podobny problem od kilku tygodni temu. Występuje sytuacja wyścigowa, którą można prawdopodobnie rozwiązać za pomocą GCD (Grand Central Dispatch). Jest to podobne do rozwiązania zaproponowanego przez @rakeshNS, ale mniej niebezpieczne. (Używanie timerów to zła praktyka w radzeniu sobie z warunkami wyścigu, chociaż w wielu językach wywoływanie metody z odliczaniem czasu przez 0 sekund jest sztuczką wykorzystywaną do wywołania tej metody na końcu stosu wywołań, co powoduje, że jest ona asynchroniczna). Apple zapewnia do tego mechanizm.
chciałbym spróbować co ten niewielki edit:
[customAlertLoad dismissViewControllerAnimated:NO completion:^{
dispatch_async(dispatch_get_main_queue(), ^(void) {
CustomAlertMsg *cust = [[CustomAlertMsg alloc] init];
cust.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
cust.modalPresentationStyle = UIModalPresentationFormSheet;
cust.delegate = self;
[self.navigationController presentModalViewController:cust animated:YES];
cust.view.superview.frame = CGRectMake(0, 0, 458, 230);
cust.view.superview.center = self.view.center;
});
}];
Wezwanie do dispatch_async stawia blok na końcu stosu wykonania. Nie ma sposobu, aby to się udało, zanim modal zostanie odrzucony. Pozwala to również na animację na temat zwolnienia i prezentacji dwóch modów.
Należy jednak wspomnieć, że w tym konkretnym problemie jest to hack. Masz problem gdzieś indziej. Jeśli odtwarzam twoją konfigurację w projekcie testowym, mogę utworzyć/odrzucić tyle modów, ile chcę, z bloków ukończenia bez uruchamiania się z błędem (o ile kod zwolnienia jest wywoływany z niestandardowego oddzwaniania delegata używanego do odrzucania modalu , jak sugeruje jabłko). Chciałbym przejrzeć niestandardowy kod alertów i niestandardowy kod alertów.
edit koniec
To nie może być taka sama, jak problem, ja doświadczyłem tego problemu, zanim z popovers po przeprowadzce mój kod bazowy do łuku. Działy się dziwne rzeczy, w których mój Popover pojawiał się zbyt wcześnie lub zbyt długo. Rozwiązaniem było utworzenie zmiennej instancyjnej, która utrzymywałaby Popover, i zarządzała jej ręczną likwidacją. Wtedy wszystko zaczęło pracować nad honorem.
Więc chciałbym zrobić:
@interface YourClass:UIViewController
@property (nonatomic,strong) CustomAlertMsg *cust;
@end
@implementation YourClass
... Codey Code....
-(void)pushView{
// For the sake of sanity, nil the modal here
if(self.cust != nil) self.cust = nil;
self.cust = [[CustomAlertMsg alloc] init];
self.cust.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
self.cust.modalPresentationStyle = UIModalPresentationFormSheet;
self.cust.delegate = self;
[self.navigationController presentModalViewController:self.cust animated:YES];
self.cust.view.superview.frame = CGRectMake(0, 0, 458, 230);
self.cust.view.superview.center = self.view.center;
}
// Then where you dismiss it, or in the delegate callback that is
// called when you dismiss it, if you are using one anyway,
// nil it out
- (void)methodThatDismissesModal
{
[self dismissModalViewControllerAnimated:YES];
// This is pretty important
if(self.cust != nil) self.cust = nil;
}
... Codey Code....
@end
Co oznacza '' isBeingPresented' lub właściwości isBeingDismissed' kontrolera widoku sugerować w bloku zakończeniu? – neeraj
Próbowałem przetestować isBeingDismissed, ale wynik jest zawsze NIE, stąd nadal wyświetlane jest ostrzeżenie. – Rye
Sprawdziłeś, który VC jest tym 'UINavigationController: 0x76a8450'? 'customAlertLoad' lub' cust'? – neeraj