0

UIViewController Containment に関する WWDC ビデオを見て、次のブログ記事を読みました: http://www.cocoanetics.com/2012/04/containing-viewcontrollers/

しかし、最初のView Controllerを表示できません。足りないものはありますか?私の ContainerViewController.m で

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    _homeViewController = [[HomeViewController alloc] init];
    _detailViewController = [[DetailViewController alloc] init];

    [self setSubViewControllers:@[_homeViewController, _detailViewController]];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

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

    if (_selectedViewController.parentViewController == self) {
        // nothing to do
        return;
    }

    // adjust the frame to fit the container view
    _selectedViewController.view.frame = _containerView.bounds;

    // make sure that it resizes on rotation automatically
    _selectedViewController.view.autoresizingMask = _containerView.autoresizingMask;

    // add as child VC
    [self addChildViewController:_selectedViewController];

    // add it to container view, calls willMoveToParentViewController for us
    [_containerView addSubview:_selectedViewController.view];

    // notify that move is done
    [_selectedViewController didMoveToParentViewController:self];
}

- (void)loadView {
    // set up the base view
    CGRect frame = [[UIScreen mainScreen] bounds];
    UIView *aView = [[UIView alloc] initWithFrame:frame];
    aView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    aView.backgroundColor = [UIColor blueColor];

    // set up content view
    _containerView = [[UIView alloc] initWithFrame:frame];
    _containerView.backgroundColor = [UIColor grayColor];
    _containerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [aView addSubview:_containerView];

    self.view = aView;
}

- (void)setSubViewControllers:(NSArray *)subViewControllers {
    _subViewControllers = [subViewControllers copy];

    if (_selectedViewController) {
        // remove previous VC
    }

    _selectedViewController = _subViewControllers[0];

}

私の ContainerViewController は、ストーリーボードの最初のビュー コントローラーです。シミュレーターには表示されますが、HomeViewController (コンテナー内の最初の子ビュー コントローラー) は表示されません。

デバッガーをステップ実行すると、ContainerViewController の subViewControllers プロパティに homeViewController と detailViewController が含まれています。HomeViewController の viewDidLoad も呼び出されます。ContainerViewController の背景色以外は画面に何も表示されません。

何かご意見は?ありがとう。

4

3 に答える 3

0

だから私は世界で最も明るい人ではありませんが、画面に何も表示されていなかったのは、ペン先がストーリーボードにあり、代わりにこれを行う必要があったためです。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
    _homeViewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];
    _detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];

これが、まだストーリーボードに慣れていない人の助けになることを願っています。

于 2012-12-05T19:00:06.407 に答える
0

MainStoryboard とは異なるストーリーボードのストーリーボードを介して InitialViewController を設定する場合は、その新しいストーリーボードを使用するようにプロジェクト設定を更新する必要があります。

ここに画像の説明を入力

プロジェクト設定、一般に移動し、メイン インターフェイス設定を新しいストーリーボードに設定します

ここに画像の説明を入力

于 2016-12-13T19:47:24.793 に答える
0

NSArray がありますが、C 配列としてアクセスしようとしています。

_subViewControllers[0]

次のようにする必要があります。

[_subViewControllers objectAtIndex:0];

そうは言っても、他の方法でより良いコードがいくつかあるようです。私は個人的にこれを大幅にクリーンアップして、はるかにシンプルにします。loadView と _containerView を削除し、通常どおり self.view を使用します。あなたがやろうとしていることについては、実際には親と子のView Controllerを追跡する必要さえないようです。とにかく、これは私がそれを行う方法です:

@interface ContainerViewController ()
@property (nonatomic, retain) NSArray *subViewControllers;
@end

@implementation ObservationReportViewController {
    UIViewController *_selectedViewController;
}
@synthesize subViewControllers = _subViewControllers;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        HomeViewController *homeViewController = [[HomeViewController alloc] init];
        homeViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

        DetailViewController *detailViewController = [[DetailViewController alloc] init];
        detailViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

        // Retain the view controllers.
        self.subViewControllers = @[homeViewController, detailViewController];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setSelectedViewController: [_subViewControllers objectAtIndex:0]];
}

-(void)setSelectedViewController:(UIViewController *)selectedViewController {
    if (_selectedViewController != selectedViewController) {
        [_selectedViewController.view removeFromSuperview];
        _selectedViewController = selectedViewController;
        // adjust the frame to fit the container view
        [self.view addSubview:_selectedViewController.view];
        //_selectedViewController.view.frame = _containerView.bounds;
        _selectedViewController.view.frame = self.view.bounds;
    }
}
于 2012-12-05T05:59:37.313 に答える