2015-06-07 12 views
6

Ho un UICollectionView e quando l'utente preme una cella, presento un altro controller di visualizzazione in uno UINavigationController modally utilizzando uno storyboard.follow.destinationViewController è nullo quando si presenta 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

Ora, il mio problema è che i rendimenti segue.desinationViewControllernil (come commentare nel frammento di codice dice).

Solo per il debug, ho modificato il UINavigationController in un altro controller di visualizzazione e non ho avuto alcun problema. Non so se passare da modale a push come lo stile di transizione sarà d'aiuto dato che è impossibile spingere un UINavigationController (si verifica un arresto anomalo che dice che è così).

Ho pulito il progetto e la cartella di generazione e ho riavviato il mio computer (e quindi Xcode).

Questo è quello che sembra quando si esegue l'applicazione:

Screenshot of problem

Durante la ricerca di problemi simili non ho trovato nulla su questo. La maggior parte delle altre domande riguardava le proprietà impostate sul controller della vista di destinazione come zero (come this).

Uso Xcode 5.1.1 e iOS 7.0 come destinazione di sviluppo.

Edit1

Lo stesso problema si verifica in tutte le parti della mia app ora (ovunque un UINavigationController è già presentata modale). Tuttavia,, succede solo in alcune occasioni, ma ogni volta segue.destinationViewController è ancora nil.

Edit2

ho sostituito il codice prepareForSegue con questo (farlo manualmente):

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

E questo funziona. Quindi penso che il problema risieda nello storyboard in qualche modo.

risposta

8

ho anche incontrato questo problema utilizzando veloce, ma dopo 1 ora, ha osservato che invece di segue .destinationViewController ho usato mittente .destinationViewController che incasinato tutte le cose. Sei sicuro di utilizzare il seguito non mittente?

+0

ho controllato il mio codice e usavo ** ** segue. Grazie per la risposta però – user3956212

0

Mi sono imbattuto nello stesso problema e penso che il problema sia l'incorporamento del viewcontroller all'interno di un NavigationController. Non appena ho rimosso il controller di navigazione, prepareForSegue ha funzionato come previsto e follow.destinationViewController ha iniziato a restituire la classe viewController corretta.

Volevo solo aggiungere questo come informazioni.

Quindi il mio problema era seguito.destinationViewController aveva nil in esso da passare al self.preboardingViewController:

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


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

Quindi, in rapida, ho risolto il problema più o meno allo stesso modo come il vostro, ricevendo il navigationController topviewController mi ha buttato fuori per un po '. Ecco la mia soluzione:

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

Ho avuto lo stesso problema quando incorporavo il viewcontroller all'interno di un 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 
    } 

Questo link mi aiuta:

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

+2

Sebbene questo link possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. –

+0

Questa risposta mi aiuta! Mi sono dimenticato di UINavigationController per presentare il controller. Molte grazie! –

Problemi correlati