it-roy-ru.com

добавить UIViewController в подпредставлении

Я не знаю, является ли это правильным ключом для поиска «добавить UIViewController в подпредставление» . Как вы можете видеть на моем изображении, есть два 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''

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

12
user3818576

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

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

42
Sandeep Ahuja

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

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

enter image description here

13
raki

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

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

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

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

6
user3576455

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

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

///
 [self addChildViewController:sample];

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

 [sample didMoveToParentViewController:self]; 

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

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

3
Jef

Я пытаюсь добавить 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];
2
user3576455
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];
2
Zigii Wong

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

1
Anil Varghese

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

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

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

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

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

0
user3576455