これが「サブビューにUIViewControllerを追加」を検索するのに適切なキーであるかどうかはわかりません。あなたが私のイメージで見ることができるように、2つのViewController、メインと2番目のコントローラーがあります。メインコントローラー内には、UIView(青い背景色)があります。 UIView内で、UIViewに2番目のViewControllerを追加します。私はこのコードを持っていますが、うまくいきませんでした。
これが私のコードです
#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''
ペン先を探していると思います。ここではペン先を実装しませんでした。
子包含概念を使用する必要があります。ここでは、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に示すように、コンテナビューオブジェクトをストーリーボードシーンに追加します。コンテナビューオブジェクトは、子ビューコントローラのコンテンツを表すプレースホルダーオブジェクトです。そのビューを使用して、コンテナ内の他のビューに対して子のルートビューのサイズと位置を設定します。
1つ以上のコンテナビューを持つView Controllerをロードすると、Interface Builderはそれらのビューに関連付けられた子View Controllerもロードします。適切な親子関係を作成できるように、子は親と同時にインスタンス化する必要があります。
これを行うには、StoryBoardsを使用します。
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];
私はあなたを助けることを望みます。
どうもありがとう
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
私はサブビューに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];
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];
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];
ストーリーボードのSampleViewController
にidentifierを追加することを忘れないでください
私はこのコードを使用しようとしました:
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のレイアウトは表示されません。
問題を解決するには
どうもありがとう