2015-06-07 10 views
6

Ich habe eine UICollectionView und wenn der Benutzer eine Zelle drückt, präsentiere ich einen anderen View-Controller in einem UINavigationController modal mit einem Storyboard.segue.destinationViewController ist Null beim Präsentieren von UINavigationController modal

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

Nun, mein Problem ist, dass segue.desinationViewController kehrt nil (wie der Kommentar im Code-Schnipsel sagt).

Nur zum Debuggen, änderte ich die UINavigationController zu einem anderen View-Controller und ich hatte kein Problem. Ich weiß nicht, ob der Wechsel von Modal zu Push als Übergangsstil helfen wird, da es unmöglich ist, eine UINavigationController zu drücken (ein Crash passiert, der sagt, dass es so ist).

Ich bereinigte das Projekt und den Build-Ordner und startete meinen Computer (und damit Xcode) neu.

Dies ist, wie es aussieht, wenn läuft die App:

Screenshot of problem

Wenn für ähnliche Probleme der Suche fand ich nichts. Bei den meisten anderen Fragen ging es darum, dass die Eigenschaften des Ziel-View-Controllers auf Null gesetzt wurden (z. B. this).

Ich benutze Xcode 5.1.1 und habe iOS 7.0 als Entwicklungsziel.

Edit1

Das gleiche Problem tritt in allen Teilen meiner App jetzt (überall ein UINavigationController modal dargestellt). Allerdings, passiert es nur bei einigen Gelegenheiten, aber jedes Mal segue.destinationViewController ist immer noch nil.

EDIT2

Ich ersetzte den prepareForSegue Code mit diesem (es manuell zu tun):

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]; 

Und das funktioniert. Also ich denke das Problem liegt irgendwie im Storyboard.

Antwort

8

ich auch dieses Problem mit schnellen angetroffen, aber nach 1 Stunde beobachtet, dass anstelle von segue .destinationViewController I Sender .destinationViewController verwendet, die alle Dinge durcheinander. Sind Sie sicher, dass Sie einen Sender verwenden, der nicht Absender ist?

+0

ich meinen Code überprüft, und ich wurde mit ** ** segue. Danke für die Antwort obwohl – user3956212

0

Ich lief das gleiche Problem und ich denke, das Problem ist die Einbettung der Viewcontroller in einem NavigationController. Sobald ich den Navigationscontroller entfernt habe, hat prepareForSegue wie erwartet funktioniert und segue.destinationViewController hat die korrekte viewController-Klasse zurückgegeben.

Ich wollte das nur als Info hinzufügen.

Also mein Problem war segue.destinationViewController hatte keine in es an sich selbst übergeben werden.preboardingViewController:

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


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

Also schnell, löste ich das Problem so ziemlich die gleiche Art und Weise wie bei Ihnen, immer die Navigation topviewController warf mich ein wenig ab. Hier ist meine Lösung:

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

Ich hatte das gleiche Problem beim Einbetten der Viewcontroller in einem 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 
    } 

Dieser Link hilft mir:

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

+2

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. –

+0

Diese Antwort hilft mir! Ich habe vergessen, UINavigationController des präsentierenden Controllers. Danke vielmals! –