2015-06-07 15 views
6

Mam UICollectionView i kiedy użytkownik naciśnie komórkę, prezentuję inny kontroler widoku w UINavigationController modalnie za pomocą storyboard.segue.destinationViewController jest zerowy podczas prezentacji UINavigationController modalny

- (void)collectionView:(UICollectionView *)collectionView 
didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self performSegueWithIdentifier:@"editBookIPad" 
             sender:indexPath]; 
} 


- (void)prepareForSegue:(UIStoryboardSegue *)segue 
       sender:(id)sender 
{ 
    // Did not include code for other segues, but I check which is the current one properly 
    UINavigationController *dest = segue.destinationViewController; // This is nil! 
    dest.modalPresentationStyle = UIModalPresentationFormSheet; 
    DetailsViewController *detailsVC = (id)[dest topViewController]; 
    detailsVC.stack = self.stack; 
    detailsVC.editingMode = 1; 
    detailsVC.bookToEdit = [self.fetchedResultsController objectAtIndexPath:sender]; 
    [self.collectionView deselectItemAtIndexPath:sender 
             animated:YES]; 
} 

Storyboard

Teraz moim problemem jest to, że segue.desinationViewController powraca nil (jako komentarz we fragmencie kodu mówi).

Tylko do debugowania, zmieniłem UINavigationController na inny kontroler widoku i nie miałem problemu. Nie wiem, czy zmiana z modalnego na pchnięcie jako styl przejściowy pomoże, ponieważ niemożliwe jest wepchnięcie UINavigationController (zdarza się awaria, która mówi, że tak jest).

Oczyściłem projekt i folder kompilacji i ponownie uruchomiłem komputer (a tym samym Xcode).

To jak to wygląda podczas uruchamiania aplikacji:

Screenshot of problem

Przy poszukiwaniu podobnych problemów znalazłem nic na ten temat. Większość innych pytań dotyczyło ustawiania właściwości na docelowym kontrolerze widoku zerowym (takim jak this).

Używam Xcode 5.1.1 i mam iOS 7.0 jako cel programistyczny.

Edit1

Ten sam problem występuje we wszystkich częściach mojego app NOW (wszędzie UINavigationController jest prezentowanych modally). Jednak, zdarza się to tylko przy niektórych okazjach, ale za każdym razem segue.destinationViewController jest nadal nil.

Edit2

Wymieniłem kod prepareForSegue z tym (robi to ręcznie):

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" 
                bundle:nil]; 
UINavigationController *navCon = [storyboard instantiateViewControllerWithIdentifier:@"AllBooksVCDetails"]; // The problematic navigation controller 
navCon.modalPresentationStyle = UIModalPresentationFormSheet; 
BKSBookDetailsViewController *detailsVC = (id)[navCon topViewController]; 
detailsVC.stack = self.stack; 
detailsVC.editingMode = 1; 
detailsVC.bookToEdit = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
[self presentViewController:navCon 
        animated:YES 
       completion:nil]; 
[self.collectionView deselectItemAtIndexPath:indexPath 
            animated:YES]; 

I to działa. Więc myślę, że problem leży w scenorysie.

Odpowiedz

8

ja również napotkał ten problem za pomocą szybkich, ale po 1 godzinie, zauważył, że zamiast segue .destinationViewController użyłem nadawca .destinationViewController że zawiedli wszystko. Czy jesteś pewien, że używasz segue nie nadawcy?

+0

Sprawdziłem mój kod i używałem ** ** segue. Dziękuję za odpowiedź: – user3956212

0

Wystąpił ten sam problem i myślę, że problem polega na osadzeniu kontrolera view wewnątrz kontrolera NavigationController. Jak tylko usunąłem kontroler nawigacyjny, prepareForSegue działało zgodnie z oczekiwaniami, a segue.destinationViewController zaczął zwracać poprawną klasę viewController.

Po prostu chciałem dodać to jako informację.

Mój problem polegał na tym, że segue.destinationViewController miał zero do przekazania do siebie.preboardingViewController:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "GoToPreBoarding" { 


     self.preboardingViewController = segue.destinationViewController as? PreBoardingViewController 
     self.preboardingViewController?.myShiftViewController = self 
    } 
} 

Więc w szybkich, I rozwiązać problem prawie tak samo jak ty, coraz navigationcontroller topviewController wyrzucił mnie na trochę. Oto moje rozwiązanie:

let storyboard = UIStoryboard(name: "PreBoarding", bundle: nil) 
     let navCon = storyboard.instantiateViewControllerWithIdentifier("PreBoardingNavigation") as! UINavigationController 
     navCon.modalPresentationStyle = UIModalPresentationStyle.FormSheet 
     self.preboardingViewController = navCon.topViewController as? PreBoardingViewController 
     self.preboardingViewController?.myShiftViewController = self 
     self.presentViewController(navCon, animated: true, completion: nil) 
8

Miałem ten sam problem podczas osadzania kontrolera view wewnątrz kontrolera NavigationController.

override public func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     let destinationVC = segue.destinationViewController as! UINavigationController 
     let nextViewController = destinationVC.viewControllers[0] as! SecondViewController 

     nextViewController.someProperty = someValue 
    } 

Ten link pomaga mi:

https://www.andrewcbancroft.com/2015/06/02/access-sub-controllers-from-a-uinavigationcontroller-in-swift/

+2

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. –

+0

Ta odpowiedź mi pomoże! Zapomniałem o UINavigationController przedstawienia kontrolera. Wielkie dzięki! –

Powiązane problemy