2012-04-25 3 views
0

Я пытаюсь отобразить несколько объектов UIViewController в одном представлении. Пока я хочу отобразить один объект UIViewController при загрузке приложения. Но экран приложения выглядит пустым, в то время как он должен отображать метку внутри контроллера дочернего представления.iOS: UIViewController не отображает другой UIViewController с использованием раскадровки

Вот что я сделал:

ParentViewController.h

#import <UIKit/UIKit.h> 
@interface ParentViewController : UIViewController 
{ 
    UIViewController *child1Controller; 
    UIViewController *child2Controller; 
} 
@end 

ParentViewController.m

#import "ParentViewController.h" 
#import "Child1Controller.h" 
#import "Child2Controller.h" 

@interface ParentViewController() 
@end 

@implementation ParentViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { ... } 

- (void)viewDidLoad 
{ 
    child2Controller = [[Child2Controller alloc] init]; 
    [self.view addSubview:child2Controller.view]; 

    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

} 

- (void)viewDidUnload { ... } 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { ... } 

@end 

Затем в раскадровке в интерфейсе строителя

  • добавить 3 вид контроллеры
  • присвоен класс каждому из них ParentViewController, Child1Controller & Child2Controller
  • в объекте Child2Controller, добавил UILabel взгляд изнутри.
  • в Child2Controller.h определил IBOutlet для UILabel и добавил синтезировать заявление на то же самое в Child2Controller.m
  • , наконец, в проекте-Info.plist установите главный раскадровки файл

Я не пропустить что-то более Вот?

ответ

3

Начиная с iOS 5, можно использовать Contain Containment View. Это новая методология, которая позволяет создать пользовательский контейнер контроллера, например UINavigationController или UITabBarController.

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

Например, в viewDidLoad методе вашего родительского контроллера вы можете сделать следующее:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIStoryboard *storyboard = [self storyboard]; 

    FirstChildController *firstChildScene = [storyboard instantiateViewControllerWithIdentifier:@"FirstChildScene"]; 
    [self addChildViewController:firstChildScene]; 
    [firstChildScene didMoveToParentViewController:self]; 
} 

Затем в FirstChildController переопределение didMoveToParentViewController

- (void)didMoveToParentViewController:(UIViewController *)parent 
{ 
    // Add the view to the parent view and position it if you want 
    [[parent view] addSubview:[self view]]; 
    CGRect newFrame = CGRectMake(0, 0, 350, 400); 
    [[self view] setFrame:newFrame]; 
} 

и вуаля! У вас есть контроллер, который содержит одно представление, управляемое дочерним контроллером.

Для получения дополнительной информации см. how-does-view-controller-containment-work-in-ios-5.

Надеюсь, это поможет.

+0

+1 это действительно хорошо работает. Но то, что я хотел бы выяснить, это то, что я сделал неправильно в коде/потоке, который я опубликовал. – vikmalhotra

+0

@ShiVik Что относительно Child2Controller? Загружен ли xib или вы переопределили метод * loadView *? –

+0

Нет. Я не создавал новый файл xib или 'loadView'. Что я сделал, так это то, что я добавил UIViewController в раскадровку и назначил свой пользовательский класс 'Child2Controller' в инспекторе идентификации. – vikmalhotra

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