Как добавить дочернее представление в качестве подвида представления контроллеров представления?

До сих пор я добавил дочерний вид к моему основному контроллеру представления. однако я хочу, чтобы это дочернее представление было подвидом моего представления контроллеров представления, поэтому я попытался сделать это так

[self.view addSubview:_converterViewController.view]; 

но это дает мне эту ошибку:

libc++abi.dylib: завершение с необработанным исключением типа NSException

Я знаю, что это действительно расплывчато, но по какой-то причине это все, что я когда-либо получал. так что я делаю неправильно? вот код, который я связал с этой задачей, и все это находится в моем методе viewDidAppear контроллеров представлений.

[self addChildViewController:_converterViewController];
[_converterViewController didMoveToParentViewController:self];
[self.view addSubview:_converterViewController.view];//this line produces the error

Спасибо за помощь.

Обновленная ошибка:

'NSInternalInconsistencyException', reason: 'Could not load NIB...

person Community    schedule 01.06.2014    source источник
comment
возможный дубликат addChildViewController с ошибкой NSException?   -  person Goppinath    schedule 02.06.2014
comment
libc++abi.dylib: terminating with uncaught exception of type NSException — последняя строка ошибки. прокрутите консоль немного вверх, и вы должны получить что-то вроде *** Terminating app due to uncaught exception .... Это то, что вам нужно процитировать здесь.   -  person staticVoidMan    schedule 02.06.2014
comment
Это многое объясняет, я добавлю ошибку. Спасибо   -  person    schedule 02.06.2014
comment
@JDOdle: ты видишь ConverterViewController.xib в своем проекте?   -  person staticVoidMan    schedule 02.06.2014
comment
@staticVoidMan нет, я использую Xcode 5, разве они не удалили файлы xib в Xcode 5, не переместили их или что-то в этом роде?   -  person    schedule 02.06.2014
comment
@JDOdle. ну... они не удалили xib (но это другой вопрос, который вас сейчас не касается). В любом случае, вам нужно просто [[ConverterViewController alloc] init]; вместо этого. Кроме того... удалите приложение из симулятора или перезагрузите симулятор, а затем запустите свое приложение.   -  person staticVoidMan    schedule 02.06.2014
comment
@staticVoidMan Я все еще получаю сообщение об ошибке после добавления этого кода. это дает мне предупреждение о том, что результат не используется.   -  person    schedule 02.06.2014
comment
@staticVoidMan О, извините, я неправильно понял, что вы имели в виду. Так что теперь я не получаю сообщение об ошибке, но я не могу увидеть добавленное представление. мне все еще нужно загрузить представление или что-то в этом роде?   -  person    schedule 02.06.2014
comment
@JDOdle: ну ... представление технически существует, и когда вы изменяете converterViewController.view программно, например, добавляете UILabel и т. д. или [converterViewController.view setBackgroundColor:[UIColor redColor]];, вы увидите разницу. Если вы хотите, чтобы представление, созданное вами в IB, отображалось (при использовании раскадровки), следуйте этому ссылка   -  person staticVoidMan    schedule 02.06.2014
comment
На самом деле я взглянул на этот веб-сайт и попытался использовать этот метод, но представление контейнера не может быть отправлено на задний план, как другие представления. есть ли другой способ получить содержимое из раскадровки без использования переходов?   -  person    schedule 02.06.2014


Ответы (3)


Вот шаги, которые вам нужно сделать при добавлении childViewController

UIViewController *viewController = [UIViewController new];

[self addChildViewController:viewController];
[self.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self];

1 – Создать дочерний контроллер представления
2 – Добавить его в качестве дочернего
3 – Добавить его представление в иерархию представлений 4 – Уведомить дочерний контроллер представления о том, что он был добавлен к родительскому.

person Kostiantyn Koval    schedule 01.06.2014
comment
это не проблема с добавлением дочернего контроллера представления. Как вы сказали, это проблема загрузки файлов пера. Как вы сказали - Не удалось загрузить NIB... Посмотрите, правильно ли подключены все ваши IBoutlets и IBActions. - person Kostiantyn Koval; 02.06.2014

Для раскадровки выполните:

//instead of
//[[ConverterViewController alloc] init];
//do
//in my case, Storyboard name was "Main"
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
_converterViewController = [storyboard instantiateViewControllerWithIdentifier:@"ConverterViewController"];

//add as childViewController
[self addChildViewController:_converterViewController];
[_converterViewController didMoveToParentViewController:self];
//optional: modify parameters if needed
[_converterViewController.view setBackgroundColor:[UIColor redColor]];
[_converterViewController.view setFrame:CGRectMake(0, 64, 320, 100)];
[self.view addSubview:_converterViewController.view];

Предположения:

  1. Название раскадровки "Main" (у вас может быть просто "Раскадровка")

    • Project Targets
  2. Идентификатор раскадровки ConverterViewController в раскадровке ConverterViewController

    • Identity Inspector
person staticVoidMan    schedule 02.06.2014

В моей ситуации я избегал использования нескольких представлений как части одного и того же контроллера представления для дизайна пользовательского интерфейса в IB, однако я вернулся к этому методу после исправления проблем с дизайном. Это устраняет весь код, необходимый для использования дочерних контроллеров представления, и делает мою потребность в решении этой проблемы недействительной. Я сделал это незадолго до того, как staticVoidMan опубликовал свое возможное решение, и у меня нет намерения проверять, работает ли его решение.

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

person Community    schedule 03.06.2014