2014-12-23 4 views
10

Я не знаю, является ли это правильной клавишей для поиска «добавить UIViewController в subview». Как вы можете видеть на моем изображении, есть два ViewController, главный и второй контроллеры. Внутри главного контроллера есть UIView (синий цвет фона). Внутри UIView я хочу добавить второй ViewController в свой UIView. У меня есть этот код, но он не работает.добавить UIViewController в subview

enter image description here

вот мой код

#import "ViewController.h" 
#import "SampleViewController.h" 
@interface ViewController() 
@property (weak, nonatomic) IBOutlet UIView *testView; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    SampleViewController * sample = [[SampleViewController alloc] initWithNibName:@"SampleViewController" bundle:nil]; 
    sample.view.frame = CGRectMake(0, 0, self.testView.bounds.size.width, self.testView.bounds.size.height); 
    [self.testView addSubview:sample.view]; 
} 

@end 

Я хочу знать, если это возможно? Я знаю, что initWithNibName: работает в файле xib, я не говорю о точном выражении для поиска в google об этом. Я просто пытаюсь что-то экспериментировать, если это возможно в IOS. Надеюсь, вы поймете, что я пытаюсь сделать. Надеюсь на ваш совет. Заранее спасибо

вот мое обновление

@interface ViewController() 
@property (weak, nonatomic) IBOutlet UIView *testView; 
@property(strong,nonatomic) SampleViewController * samples; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

UIStoryboard *storyBoard = self.storyboard; 
SampleViewController * sample = [storyBoard instantiateViewControllerWithIdentifier:@"SampleViewController"]; 
// SampleViewController * sample = [[SampleViewController alloc] //initWithNibName:@"SampleViewController" bundle:nil]; 

[self displayContentController:sample]; 
//commented the below line because it is not needed here, use it when you want to remove   
//child view from parent. 
//[self hideContentController:sample]; 

} 

- (void) displayContentController: (UIViewController*) content; 
{ 
    [self addChildViewController:content];     // 1 
    content.view.bounds = self.testView.bounds;     //2 
    [self.testView addSubview:content.view]; 
    [content didMoveToParentViewController:self];   // 3 
} 


- (void) hideContentController: (UIViewController*) content 
{ 
    [content willMoveToParentViewController:nil]; // 1 
    [content.view removeFromSuperview];   // 2 
    [content removeFromParentViewController];  // 3 
} 

Я всегда получаю эту ошибку

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/ace/Library/Developer/CoreSimulator/Devices/035D6DD6-B6A5-4213-9FCA-ECE06ED837EC/data/Containers/Bundle/Application/EB07DD14-A6FF-4CF5-A369-45D6DBD7C0ED/Addsubviewcontroller.app> (loaded)' with name 'SampleViewController'' 

Я думаю, его ищет перо. Здесь я не использовал нить.

+0

узнать через это http://www.objc.io/issue-12/custom-container-view-controller-transitions.html – sanjeet

+0

@ user3818576 Я отредактировал мой ответ в соответствии с вашими потребностями, пожалуйста, используйте его и дайте мне знать, если я могу устранить его больше. –

+0

@ user3818576 1. Вы работаете с файлами nib или раскадровкой? –

ответ

39

Вы должны использовать концепцию сдерживания ребенка, здесь MainViewController является контроллером родительского вида и вы хотите, чтобы добавить вид ребенка вида контроллера, как подматрица на Main View Controller.

Добавление и удаление ребенок

//call displayContentController to add SampleViewCOntroller view to mainViewcontroller 
[self displayContentController:sampleVCObject]; 

// write this method in MainViewController 
- (void) displayContentController: (UIViewController*) content; 
{ 
    [self addChildViewController:content];     // 1 
    content.view.bounds = testView.bounds;     //2 
    [testView addSubview:content.view]; 
    [content didMoveToParentViewController:self];   // 3 
} 

Вот что делает этот код:

Он называет контейнера addChildViewController: метод добавления ребенка. Вызов метода addChildViewController: также вызывает метод willMoveToParentViewController для ребенка: метод автоматически. Он обращается к свойству вида child для извлечения представления и добавляет его в свою собственную иерархию представлений. Контейнер устанавливает размер и положение ребенка перед добавлением вида; контейнеры всегда выбирают, где отображается содержимое ребенка. Хотя этот пример делает это, явно устанавливая фрейм, вы также можете использовать ограничения компоновки, чтобы определить позицию представления. Он явно вызывает дочерний метод didMoveToParentViewController: метод, чтобы сигнализировать о завершении операции.

//you can also write this method in MainViewController to remove the child VC you added before. 
- (void) hideContentController: (UIViewController*) content 
{ 
    [content willMoveToParentViewController:nil]; // 1 
    [content.view removeFromSuperview];   // 2 
    [content removeFromParentViewController];  // 3 
} 

Для получения более подробной информации, пожалуйста, обратитесь к яблочному документу: https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

Настройка контейнера в Interface Builder, для тех, кто не хочет писать код.

Чтобы создать отношения между родительским и дочерним контейнерами во время разработки, добавьте объект просмотра контейнера в сцену раскадровки, как показано на рисунке 5-3. Объект представления контейнера является объектом-заполнителем, который представляет содержимое контроллера дочернего представления. Используйте этот вид для определения размера и расположения корневого представления ребенка по отношению к другим представлениям в контейнере.

Adding a container view in Interface Builder При загрузке контроллера вида с одним или несколькими видами контейнера Interface Builder также загружает дочерние контроллеры представления, связанные с этими видами. Дети должны быть созданы одновременно с родителем, чтобы можно было создать соответствующие отношения родитель-ребенок.

+0

Хорошо, я прочитаю это – user3818576

+0

@ user3818576 внимательно прочитайте этот документ, решит вашу проблему и поможет проникнуть внутрь этого вопроса для будущего использования. –

+0

спасибо @Sandeep Ahuja. – user3818576

2
SampleViewController * sample = [[SampleViewController alloc] initWithNibName:@"SampleViewController" bundle:nil]; 
sample.view.frame = CGRectMake(0, 0, self.testView.bounds.size.width, self.testView.bounds.size.height); 

[self addChildViewController:sample]; 
[self.testView addSubview:sample.view]; 
+0

У меня здесь были ошибки. Сожалею. Но когда я заменю initwithnibname на init. Ошибок нет, но выход пуст в моем uiview. – user3818576

+0

@ user3818576 Какая ошибка? –

+0

вот ошибка «Завершение приложения из-за неперехваченного исключения» NSInternalInconsistencyException », причина:« Не удалось загрузить NIB в комплекте ». Я думаю, что файл nib, я не знаю об этом. sorry noob here – user3818576

1

Поскольку ваш контроллер представления в раскадровке, вы должны использовать instantiateViewControllerWithIdentifier, чтобы получить VC от раскадровки.

SampleViewController * sample = [self.storyboard instantiateViewControllerWithIdentifier:@"IdOfSampleViewController"]; 
sample.view.frame = CGRectMake(0, 0, self.testView.bounds.size.width, self.testView.bounds.size.height); 
[self.testView addSubview:sample.view]; 

Не забывайте добавлять идентификатор для SampleViewController в раскадровке

+0

Хорошо, я попробую это – user3818576

+0

. У меня здесь нет ошибки, но я добавляю кнопку в свой второй ViewController. Я получаю сообщение об ошибке. – user3818576

+0

При нажатии кнопки? Какая ошибка? Вероятно, это из-за SampleViewController освобождается. –

2

Вы можете добавить childViewController в UIViewController с iOS5 .. это отличный способ создания меньшего, более многоразового просмотраКонтроллеры, мне также очень нравится.

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

/// 
[self addChildViewController:sample]; 

[self.testView addSubview:sample.view]; //you already have this.. 

[sample didMoveToParentViewController:self]; 

В вас viewWillDisappear: или один из других методов Teardown вам нужно очистить, как это:

//we'll need another pointer to sample, make it an iVar/property.. 
    [sample willMoveToParentViewController:nil]; // 1 
    [sample removeFromSuperview];   // 2 
    [sample removeFromParentViewController];  // 3 

Вы можете прочитать документы компании Apple на сдерживании ребенка viewControllers здесь https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

+0

hello jef, у меня такая же ошибка с другим ответом. Я все еще пытаюсь понять, как работать над этой ошибкой. «Завершение приложения из-за неперехваченного исключения» NSInternalInconsistencyException », причина:« Не удалось загрузить NIB в пакете » – user3818576

+0

инициализатор, который вы пытаетесь использовать здесь initWithNibName: пакет« SampleViewController »: nil задает файл SampleViewController.xib .if, t иметь такой файл, а затем изменить nibName Аргумент на нуль .. – Jef

12

Вы можете сделать это просто с помощью раскадровки

  • Открытые раскадровки и выберите контроллер вида, в котором присутствует ваш синий вид, откройте «Утилиты» для поиска ContainerView и перетащите его в свой синий вид, это автоматически добавит контроллер вида, который будет представлять собой дочерний вид для вашего вида. Вы можете изменить размер контейнера в инспекторе размеров.

enter image description here

+0

привет raki. Эта работа отлично подходит для меня, но я хочу знать, как эта работа программно. Спасибо за Ваш ответ. Я узнаю от вас здесь – user3818576

+0

все остальные ответы предназначены для этого программно ... :) – raki

0

Я пытаюсь использовать этот код:

SecondViewController * secondViewController = [[SecondViewController Alloc] initWithNibName: ноль расслоение: ноль];

secondViewController.view.frame = CGRectMake(0, 0, self.mySubView.bounds.size.width, self.mySubView.bounds.size.height); 

[self addChildViewController:secondViewController]; 
[self.viewDialogSolution addSubview:secondViewController.view]; 

но я вижу, что только myview не является макетом secondViewController.

Хо, чтобы решить проблемы?

Большое спасибо

+0

Проверьте обновление моего сообщения. Это может помочь вам. – user3818576

+0

ok, теперь я вижу uiviewcontroller в моем основном представлении, но как увидеть содержимое uiview в uiviewcontroller? В myuiviewcontroller я установил uiview с текстом, как его увидеть в моем основном представлении? – user3576455

+0

Я установил красный цвет фона viewvontroller, я вижу красный цвет, но я не вижу uiview? Мне нужно связать 2 viewcontroller? Я создал только макет второго viewcontroller и остановился, я должен что-то сделать? – user3576455

4

Я решил проблему о UIView на второй UIViewController. Следуйте код, который я использовал:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
SecondViewController *sb = (SecondViewController *)[storyboard instantiateViewControllerWithIdentifier:@"sb"]; 

sb.view.backgroundColor = [UIColor redColor];  
[sb willMoveToParentViewController:self]; 

[self.view addSubview:sb.view]; 

[self addChildViewController:sb]; 
[sb didMoveToParentViewController:self]; 

Я надеюсь, чтобы помочь вам.

Большое спасибо

+0

Можно ли объяснить пример кода? – PatJ

2

Я Тринг добавление UIViewController в подвид, и эта работа. На UIViewController я добавил 2 кнопки в файле .h:

-(IBAction)matchButtonAction:(id)sender; 
-(IBAction)closeButtonAction:(id)sender; 

И в.m файл:

-(IBAction)matchButtonAction:(id)sender 
{ 
    NSLog(@"matchButtonAction"); 
} 
-(IBAction)closeButtonAction:(id)sender 
{ 
    NSLog(@"closeButtonAction"); 
} 

но я не вижу журнал.

Мне нужно добавить тот же параметр в UIViewController instantiateViewControllerWithIdentifier?

Как решить проблему?

Моя инициализация UIViewController является:

AlertDialogViewController *alertDialogView = (AlertDialogViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"alertDialogView"];   
     [alertDialogView willMoveToParentViewController:self]; 
     [viewController.view addSubview:alertDialogView.view]; 
     [viewController addChildViewController:alertDialogView]; 
     [alertDialogView didMoveToParentViewController:viewController]; 
+0

проблема решена. У меня был uibutton из uiview – user3576455

+0

Можете ли вы рассказать, как его удалить? – python

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