Добавить 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 также загружает дочерние контроллеры представления, связанные с этими представлениями. Дети должны быть созданы одновременно с родителем, чтобы можно было создать соответствующие отношения родитель-потомок.
Ответ 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 для разрешения пролема?
Спасибо большое