1

У меня 6 UIViewControllers, связанные с нажатием перетекает с идентификаторами и функциональность в моем приложении к «скачке» к желаемым UIViewController, используя этот метод для укладки ViewControllers:iOS8 проблемы при попытке нажать несколько UIViewControllers в NavigationController

- (void) JumpTo6 { 
UINavigationController *nav = self.navigationController; 
UIViewController *a =[self.storyboard instantiateViewControllerWithIdentifier:@"2"]; 
[nav pushViewController:a animated:NO]; 
UIViewController *b =[self.storyboard instantiateViewControllerWithIdentifier:@"3"]; 
[nav pushViewController:b animated:NO]; 
UIViewController *c =[self.storyboard instantiateViewControllerWithIdentifier:@"4"]; 
[nav pushViewController:c animated:NO]; 
UIViewController *d =[self.storyboard instantiateViewControllerWithIdentifier:@"5"]; 
[nav pushViewController:d animated:NO]; 
UIViewController *e =[self.storyboard instantiateViewControllerWithIdentifier:@"6"]; 
[nav pushViewController:e animated:YES]; 

При использовании iOS7 все работало нормально. Я бы уволил этот метод и предположил, что я нахожусь на UIViewController, система будет складывать каждый UIViewController до UI VC 6 и UIViewController шесть будут представлены с анимацией.

Но на iOS8 появляется странное поведение. Система показывает мне UIViewcontroller 5 в течение короткого периода времени, а затем переходит на UIViewcontroller 6. Этого я не хочу.

Таким вещи:

IOS, 7: 1 -----> 6 - желательно

IOS, 8: 1 -----> 5 (в течение короткого периода времени) - ---> 6 - нежелательно

Мой вопрос в том, как добиться желаемого эффекта с помощью iOS 8. Ty!

+0

Почему вы хотите это сделать? Это не обычный способ использования навигационного контроллера. Если пользователь нажимает кнопку «Назад» (от 6) в этом сценарии, он вернется к 5, что он никогда раньше не видел - он ожидал, что отправится в 1, так как именно там он и появился. – rdelmar

+0

Это именно то, что я хочу. –

+0

Ну, надеюсь, Apple будет в порядке с этим. Я не знаю, нарушает ли это HIG или нет. – rdelmar

ответ

3

Используйте метод:

- (void)setViewControllers:(NSArray *)viewControllers 
       animated:(BOOL)animated 

установить все контроллеры в то время, показывая только последний.

В вашем случае:

- (void) JumpTo6 { 
    UINavigationController *nav = self.navigationController; 
    UIViewController *a = [self.storyboard instantiateViewControllerWithIdentifier:@"2"]; 
    UIViewController *b = [self.storyboard instantiateViewControllerWithIdentifier:@"3"]; 
    UIViewController *c = [self.storyboard instantiateViewControllerWithIdentifier:@"4"]; 
    UIViewController *d = [self.storyboard instantiateViewControllerWithIdentifier:@"5"]; 
    UIViewController *e = [self.storyboard instantiateViewControllerWithIdentifier:@"6"]; 
    NSArray *viewControllers = nav.viewControllers; 
    NSArray *newViewControllers = [NSArray arrayWithObjects:a, b, c, d, e, nil]; 
    [nav setViewControllers:[viewControllers arrayByAddingObjectsFromArray:newViewControllers] animated:YES]; 
} 
+0

Это было бы замечательно, но метод setViewControllers '(void) заменит контроллеры представлений, управляемые контроллером навигации, с указанными элементами, с которыми я не могу справиться. Важно, чтобы контроллеры представлений управлялись навигационным контроллером. –

+0

@AndrejTrilavov 'setViewControllers: animated:' будут заменять контроллеры представлений *, которыми управляет контроллер навигации *. Затем контроллер навигации будет управлять вновь установленными контроллерами представлений. Этот ответ является правильным решением вашей проблемы и будет делать именно то, что вы хотите. – Greg

+0

@PartiallyFinite Да, вы правы. В заключение я должен был быстро заключить. Но когда я пытаюсь реализовать этот метод, я получаю 'No visible @interface для 'NSArray' объявляет селектор 'arrayByAddingObjectsFromArray: анимированный:'' (последняя строка кода). Извините, если я пропущу что-то очевидное, снова. Ty! Я ценю вашу помощь. –

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