2013-02-18 13 views
6

Utworzono dwa UIViewControll, które są przedstawiane jako modalne. Powiedzmy, dla pierwszych 5 próbach modalna zaprezentuje normalnie, ale potem da mi:Ostrzeżenie dotyczące dwóch kontrolerów nawigacyjnych, które zostały przedstawione jako modalne.

Warning: Attempt to dismiss from view controller <UINavigationController: 0x76a8450> while a presentation or dismiss is in progress! 

Poniżej znajduje się kod do odwoływania bieżący kontroler widoku i prezentuje kolejną

[customAlertLoad dismissViewControllerAnimated:NO completion:^{ 
    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; 
}]; 

Każda pomoc będzie być bardzo docenionym.

+0

Co oznacza '' isBeingPresented' lub właściwości isBeingDismissed' kontrolera widoku sugerować w bloku zakończeniu? – neeraj

+0

Próbowałem przetestować isBeingDismissed, ale wynik jest zawsze NIE, stąd nadal wyświetlane jest ostrzeżenie. – Rye

+0

Sprawdziłeś, który VC jest tym 'UINavigationController: 0x76a8450'? 'customAlertLoad' lub' cust'? – neeraj

Odpowiedz

2

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

Spróbuj tego,

[customAlertLoad dismissViewControllerAnimated:NO completion:^{ 

    [self performSelector:@selector(pushView) withObject:ni afterDelay:0.4]; 
} 


-(void)pushView{ 
    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; 
} 
+0

nadal nie ma szczęścia. Próbowałem już ustawić interwał na 1 – Rye

+2

poleganie na opóźnieniach w radzeniu sobie z warunkami wyścigowymi to kiepska praktyka ... – nielsbot

1

próbować zmienić to:

[self.navigationController presentModalViewController:cust animated:NO]; 
+0

To działa dobrze, ale układ modalu jest pomieszany. – Rye

1

Może spróbuj oddalając od kontrolera nawigacyjnego zamiast customAlertLoad:

[self.navigationController dismissViewControllerAnimated:NO completion:^{ 

    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; 

}]; 
2

jako komunikat_o_błędzie mówi, problem pojawia się podczas zwalniając. Więc to nie jest presentModalViewController, które powoduje kłopoty, to jest dismissViewControllerAnimated.

Jeśli możesz wkleić kontekst dla tego połączenia, możemy znaleźć rozwiązanie.

Powiązane problemy