web-dev-qa-db-ja.com

StoryBoardを使用してコンテナビュー内にUIViewControllerをロードします

UIViewControllerというRootViewControllerUIViewControllerというNewsViewControllerがあります。 NewsViewController内にUIViewを表示したい(UIViewは画面の一部にすぎません)RootViewController内に作成しました。私はStoryBoardを使用しており、アプリはiOS 5をサポートする必要があります(そのため、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.
}

また、両方のUIViewControllerをセグエで接続しました。 UIView newsSectionは空のままです。私は何を間違えていますか?

編集:

これは私にとってはうまくいきます、それは正しいアプローチですか?

- (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];
}
26
Segev
- (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];
}

Swift

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)
}
44
Segev

ルート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];
}
10

これが私にとっての働き方です。

上部の購入、販売、レンタルに3つのボタンがあります。現在、特定のボタンをタップすると、対応するUIViewControllerをロードしており、ストーリーボードを使用しています。

UIViewControllerごとにStoryboard Idを指定しました。

これらの3つのボタン(Purchase、Sale、Rental)を持つ2つのUIViewMain 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];       
}

さらに私にとっては完璧に機能し、スクロールしたいビューiをそこに追加できます。

1

これを試して:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                                                     bundle:nil];
NewsViewController *rootViewController = 
 [storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];
1
Lithu T.V
        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);

特にアニメーションを実行する場合は、制約を指定することを忘れないでください

1
Vassily

コードを-(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}であるため

0
stosha