2015-06-07 5 views
6

У меня есть UICollectionView, и когда пользователь нажимает на ячейку, я представляю другой контроллер вида в UINavigationController, используя раскадровку.segue.destinationViewController при подаче 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

Теперь моя проблема заключается в том, что segue.desinationViewController возвращает nil (как комментарий в фрагменте кода говорит).

Просто для отладки, я изменил UINavigationController на другой контроллер представления, и у меня не было проблем. Я не знаю, поможет ли переход от модального к нажатию, поскольку стиль перехода поможет, так как невозможно нажать UINavigationController (произошел сбой, который говорит, что это так).

Я очистил проект и папку сборки и перезапустил компьютер (и, следовательно, Xcode).

Это то, что он выглядит, когда работает приложение:

Screenshot of problem

При поиске подобных проблем я не нашел ничего об этом. Большинство других вопросов касалось свойств, заданных на контроллере представления назначения, который равен нулю (например, this).

Я использую Xcode 5.1.1 и имею iOS 7.0 в качестве цели разработки.

Edit1

Та же проблема происходит во всех частях моего приложения сейчас (везде UINavigationController представлено модально). Однако, это случается только в некоторых случаях, но каждый раз segue.destinationViewController по-прежнему nil.

Edit2

Я заменил prepareForSegue код с этого (делать это вручную):

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

И это работает. Поэтому я думаю, что проблема кроется в раскадровке.

ответ

8

Я также столкнулся с этой проблемой, используя быстрые, но через 1 час, заметил, что вместо Segue .destinationViewController Я использовал отправитель .destinationViewController что перепутались все. Вы уверены, что используете segue not sender?

+0

Я проверил мой код, и я использовал ** SEGUE **. Спасибо за ответ, хотя – user3956212

0

Я столкнулся с той же проблемой, и я думаю, что проблема заключается в встраивании viewcontroller внутри NavigationController. Как только я удалил навигационный контроллер, prepareForSegue работал как ожидалось, и segue.destinationViewController начал возвращать правильный класс viewController.

Просто хотел добавить это в качестве своей информации.

Итак, моя проблема заключалась в segue.destinationViewController, ноль в ней был передан самому себе.preboardingViewController:

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


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

Так стрижа, я решил эту проблему в значительной степени так же, как ваша, получая navigationcontroller topviewController бросил меня немного. Вот мое решение:

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

У меня была такая же проблема при внедрении viewcontroller внутри 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 
    } 

Эта ссылка помогает мне:

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

+2

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

+0

Этот ответ поможет мне! Я забыл о UINavigationController для представления контроллера. Большое спасибо! –

Смежные вопросы