Подтвердить что ты не робот

Загрузите UIViewController внутри контейнера с помощью StoryBoard

У меня есть UIViewController, называемый RootViewController и A UIViewController, называемый NewsViewController. Я хочу показать NewsViewController внутри a UIView (UIView - это только часть экрана), который я создал внутри RootViewController. Я использую StoryBoard, и мое приложение должно поддерживать iOS 5 (поэтому я не могу использовать встроенные сегменты aka Containers из IB)

Код RootViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NewsViewController *news = [[NewsViewController alloc]init];
    news.view.frame = self.newsSection.bounds;
    [self.newsSection addSubview:news.view];
    [self addChildViewController:news];
    // Do any additional setup after loading the view.
}

Я также подключил оба UIViewControllers с помощью segue. UIView newsSection останется пустым. Что я делаю неправильно?

Edit:

Это работает для меня, это правильный подход?

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    NewsViewController *news = [storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];
    news.view.frame = self.newsSection.bounds;
    [self.newsSection addSubview:news.view];
    [self addChildViewController:news];
    [news didMoveToParentViewController:self];
}
4b9b3361

Ответ 1

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    NewsViewController *news = [storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];
    news.view.frame = self.newsSection.bounds;
    [self.newsSection addSubview:news.view];
    [self addChildViewController:news];
    [news didMoveToParentViewController:self];
}

Свифта

override func viewDidLoad() {
    super.viewDidLoad()
    let news = self.storyboard?.instantiateViewControllerWithIdentifier("NewsViewControllerID") as! NewsViewController
    news.view.frame = newsSection.bounds
    newsSection.addSubview(news.view)
    addChildViewController(news)
    news.didMoveToParentViewController(self)
}

Swift >= 3:

override func viewDidLoad() {
    super.viewDidLoad()
    let news = self.storyboard?.instantiateViewController(withIdentifier: "NewsViewControllerID") as! NewsViewController
    news.view.frame = newsSection.bounds
    newsSection.addSubview(news.view)
    addChildViewController(news)
    news.didMove(toParentViewController: self)
}

Ответ 2

Создайте дочерний элемент при создании root VC:

-(void)awakeFromNib
{
  [super awakeFromNib];
  // Create news vc from storyboard
  UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"YourStoryboard" bundle:nil];
  NewsViewController *news = [storyboard instantiateViewControllerWithIdentifier:@"News VC ID, you should set it in IB"];
  // Add it as a child to root
  [self addChildViewController:news];
  [news didMoveToParentViewController:self];
  // Save it for future use
  self.news = news;
}

Добавить дочерний вид при создании корневого представления:

-(void)viewDidLoad
{
  [super viewDidLoad];
  self.news.view.frame = self.newsSection.bounds;
  [self.newsSection addSubview:self.news.view];
}

Ответ 3

Попробуйте следующее:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                                                     bundle:nil];
NewsViewController *rootViewController = 
 [storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];

Ответ 4

Вот такой подход, как он работал у меня.

У меня есть 3 кнопки в верхней части. Покупка, продажа, аренда. теперь при нажатии на любую конкретную кнопку я загружаю соответствующий UIViewController, и я использую раскадровку.

Я указал Storyboard Id для каждого UIViewController.

Я добавил два UIView в мой Main ViewController, у которых есть эти 3 кнопки (покупка, продажа, аренда).

один вид, который я использую для указанных выше трех кнопок и других, которые я использую для загрузки UIViewController.

Теперь, нажав на определенную кнопку, я и нажав определенную кнопку, я делаю следующий код.

- (IBAction)sellingClicked:(id)sender
{        
    UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];

    TestViewController *tvc=[storyboard instantiateViewControllerWithIdentifier:@"test"];

    [self.viewContainer addSubview:tvc.view];
    [self addChildViewController:tvc];       
}

и он отлично работает для меня, вы можете добавить прокрутку View i, которую вы хотите прокрутить там.

Ответ 5

        otherController!.view.frame = container.bounds;
        self.addChildViewController(otherController!);
        container.addSubview(otherController!.view);
        container.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|", options: .allZeros, metrics: nil, views: ["view": otherController!.view]))
        container.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: .allZeros, metrics: nil, views: ["view": otherController!.view]))
        otherController!.didMoveToParentViewController(self);

Не забудьте указать ограничение, особенно если вы хотите выполнять анимацию

Ответ 6

Вы должны переместить свой код в - (void) viewDidAppear: (BOOL), анимированный как

- (void) viewDidAppear: (BOOL) animated
{
    [super viewDidAppear: animated];

    NewsViewController *news = [[NewsViewController alloc]init];
    news.view.frame = self.newsSection.bounds;
    [self.newsSection addSubview:news.view];
    [self addChildViewController:news];
    // Do any additional setup after loading the view.
}

потому что кадр и границы в viewDidLoad являются {0,0} {0,0}