Добавить UIViewController в subview

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

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''

Думаю, он ищет нитку. Я не использовал нить здесь.

Ответ 1

Вы должны использовать концепцию детского удержания, здесь 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: также вызывает метод childSMoveToParentViewController: метод автоматически. Он получает доступ к представлению childs для получения представления и добавляет его в свою собственную иерархию представлений. Контейнер устанавливает размер и положение дочерних элементов перед добавлением вида; контейнеры всегда выбирают, где появляется дочернее содержимое. Хотя этот пример делает это, явно устанавливая фрейм, вы также можете использовать ограничения макета, чтобы определить позицию вида. Он явно вызывает childs 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
}

Подробнее см. в документе apple doc: https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

Конфигурирование контейнера в построителе интерфейсов для тех, кто не хочет писать код.

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

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

Ответ 2

Вы можете сделать это, просто используя StoryBoards

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

enter image description here

Ответ 3

Я решил проблему с 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];

Я надеюсь вам помочь.

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

Ответ 4

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

Ответ 5

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

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

///
 [self addChildViewController:sample];

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

 [sample didMoveToParentViewController:self]; 

В вашем представленииWillDisappear: или один из других методов удаления, который вам нужно будет очистить следующим образом:

//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

Ответ 6

Я перехожу к добавлению UIViewController в subview, и эта работа. На 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];

Ответ 7

Поскольку ваш контроллер просмотра находится в раскадровке, вы должны использовать 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 в раскадровке

Ответ 8

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

SecondViewController * secondViewController = [[SecondViewController alloc] initWithNibName: nil bundle: nil];

 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.

Ho для разрешения пролема?

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