2013-02-24 4 views
0

Я пытаюсь загрузить UIViewController на том же раскадровке, я дал контроллеру просмотра идентификатор раскадровки, идентификатор восстановления (такой же, как идентификатор раскадровки) и заголовок контрольного элемента «разбивка».Загрузка UIViewController на той же раскадровке

У меня есть действие, зарегистрированное в качестве getStarted, в котором я бегу следующий код, я также импортировать контроллер представления, я хочу, чтобы загрузить в контроллер просмотра с Get Started кнопку

#import "BreakdownViewController.h" 

'

- (IBAction)getStarted:(id)sender { 
    NSLog(@"Yes"); 
    BreakdownViewController *controller = [[BreakdownViewController alloc] initWithNibName:@"breakdown" bundle:nil]; 
    [self.navigationController pushViewController:controller animated:YES]; 
} 

Да выходит, но контроллер вида не загружается.

Любые идеи, почему?

ответ

2

Вид не загружается, потому что вы пытаетесь загрузить его из файла nib, а не из раскадровки. Я предполагаю, что BreakdownViewController является подклассом UIViewController или контроллером, который может быть загружен должным образом. Измените свой код на это.

// You could change `BreakdownViewController` to `UIViewController` if it doesn't work with it. 
    // iOS 6.0 and above. 
    BreakdownViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"breakdown"]; 
    [self presentViewController:controller animated:YES completion:nil]; 

Из-за устаревших методов вы действительно должны использовать код сверху, но вы также можете это сделать.

// iOS 5.0 
    BreakdownViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"breakdown"]; 
    [self presentModalViewController:controller animated:YES]; 

Вы можете также добавить некоторые анимации перехода к этому, а также купить добавив строку ниже как раз перед presentModalViewController или presentViewController

[controller setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 

Вы также могли бы заменить «presentModalViewController» или presentViewController линии с

[self.navigationController pushViewController:controller animated:YES]; 

EDIT

После пользователь использовал код, предоставленный выше, они получили ошибку

2013-02-24 16:08:14.517 BudgetMe[1300:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSCFString stringByAppendingString:]: nil argument' *** First throw call stack: (0x1cac012 0x10e9e7e 0x1cabdeb 0xaf87d5 0xddba 0x10f1c7 0x10f232 0x11ac25 0x31a3a3 0x117ee3 0x118167 0x312c 0x10fd705 0x312c0 0x31258 0xf2021 0xf257f 0xf16e8 0x60cef 0x60f02 0x3ed4a 0x30698 0x1c07df9 0x1c07ad0 0x1c21bf5 0x1c21962 0x1c52bb6 0x1c51f44 0x1c51e1b 0x1c067e3 0x1c06668 0x2dffc 0x252d 0x2455) 

Это становилось брошенную когда он достиг [self.navigationController pushViewController...]/[self presentViewController...] Я считаю, что была ошибка в настоящее время получение выброшены из-за проблемы на контроллере представления о том, что пользователь пытался нажать/представить. Причина, по которой я верю, заключается в том, что, когда эта строка кода ударяется, она пытается запустить такие методы, как viewDidLoad, прежде чем переходить на фактический контроллер представления, поэтому, если ошибка возникает, она отображается так, как если бы она была на этой строке. Лучший способ узнать это - воспользоваться всеми преимуществами точек останова.

Я страдал эту проблему, прежде чем NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array' when presenting view controller

+0

Я пробовал код, но я получил следующую ошибку: 2013-02-24 16: 08: 14.517 BudgetMe [1300: c07] *** Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «*** - [__NSCFString stringByAppendingString]: ноль аргумент» *** Первый стек бросить вызов: (0x1cac012 0x10e9e7e 0x1cabdeb 0xaf87d5 0xddba 0x10f1c7 0x10f232 0x11ac25 0x31a3a3 0x117ee3 0x118167 0x312c 0x10fd705 0x312c0 0x31258 0xf2021 0xf257f 0xf16e8 0x60cef 0x60f02 0x3ed4a 0x30698 0x1c07df9 0x1c07ad0 0x1c21bf5 0x1c21962 0x1c52bb6 0x1c51f44 0x1c51e1b 0x1c067e3 0x1c06668 0x2dffc 0x252d 0x2455) –

+0

@JacobClark Это не имеет никакого отношения к предоставленному коду. Поместите точку останова в '[self.navigationController pushViewController ...]' или '[self presentViewController ...]', который когда-либо использовался вами. Я считаю, что это произойдет, когда он достигнет этой строки, потому что когда он пытается представить новый контроллер представления, он пытается запустить метод 'stringByAppendingString:' на следующем контроллере. Таким образом, это показывает, что код работает, у вас просто есть другая ошибка на контроллере, который вы пытаетесь представить. – Popeye

+0

Я поставил точку останова, и она по-прежнему выбрасывает ошибку –

0

Вы, вероятно, хотите использовать это:

[self.storyboard instantiateViewControllerWithIdentifier:@"breakdown"]; 

Вместо этого Alloc initWithNibName.

-1

Если я правильно понял вопрос, у вас есть контроллер просмотра, определенный в той же раскадровке, что и тот, с которого вы пытаетесь нажать? Почему вы не используете сегу? Создайте push-сегю от источника до места назначения и нажмите кнопку триггера, который выйдет.

После перехода подключен вверх, можно программно вызвать толчок с:

[self performSegueWithIdentifier:@"breakdownSegue"]; 

Но если вы телеграфировать SEGUE непосредственно к кнопке вы хотите, чтобы вызвать SEGUE, вы можете пропустить этот шаг.

Если проблема в том, что BreakdownViewController определен во внешнем формате .xib, и вы добавили его в эту раскадровку, просто удалите представление из сцены раскадровки и загрузите его из .xib.