web-dev-qa-db-ja.com

サブビューにUIViewControllerを追加

これが「サブビューにUIViewControllerを追加」を検索するのに適切なキーであるかどうかはわかりません。あなたが私のイメージで見ることができるように、2つのViewController、メインと2番目のコントローラーがあります。メインコントローラー内には、UIView(青い背景色)があります。 UIView内で、UIViewに2番目のViewControllerを追加します。私はこのコードを持っていますが、うまくいきませんでした。

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

ペン先を探していると思います。ここではペン先を実装しませんでした。

15
user3818576

子包含概念を使用する必要があります。ここでは、MainViewControllerは親View Controllerであり、子View Controllerビューを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 を参照してください。

コードを書きたくない人のために、Interface Builderでコンテナを設定します。

設計時に親子コンテナの関係を作成するには、図5-3に示すように、コンテナビューオブジェクトをストーリーボードシーンに追加します。コンテナビューオブジェクトは、子ビューコントローラのコンテンツを表すプレースホルダーオブジェクトです。そのビューを使用して、コンテナ内の他のビューに対して子のルートビューのサイズと位置を設定します。

Adding a container view in Interface Builder 1つ以上のコンテナビューを持つView Controllerをロードすると、Interface Builderはそれらのビューに関連付けられた子View Controllerもロードします。適切な親子関係を作成できるように、子は親と同時にインスタンス化する必要があります。

46
Sandeep Ahuja

これを行うには、StoryBoardsを使用します。

  • ストーリーボードを開いて、ブルービューが存在するビューコントローラーを選択し、ユーティリティビューでContainerViewを検索してブルービューにドラッグすると、ビューの子ビューとして機能するビューコントローラーが自動的に追加されます。サイズインスペクターでコンテナービューのサイズを変更できます。

enter image description here

13
Ravi

2番目のuiviewcontrollerの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

IOS5以降、childViewControllerをUIViewControllerに追加できます。これは、より小さく、より再利用可能なviewControllerを作成するのに最適な方法です。

あなたは本当に近くにいますが、あと数行のコードが必要です。

///
 [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を追加しようとしていますが、これは機能します。 UIViewControllerでは、.hファイルに2つのボタンを追加しました。

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

View Controllerはストーリーボードにあるため、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];

ストーリーボードのSampleViewControlleridentifierを追加することを忘れないでください

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

ただし、myViewのみが表示され、secondViewControllerのレイアウトは表示されません。

問題を解決するには

どうもありがとう

0
user3576455