セグエの準備でセグエが呼び出すコントローラーを変更する方法はありますか?埋め込まれたセグエでセグメント化されたコントロールが変更されたときに、それを実行しようとしています。ありがとう!
2 に答える
お気づきかもしれませんが、セグエdestinationViewController
はreadonly
. より良い戦略は、セグメント化されたコントロール (ビューまたはコントロールではなく) を保持するビュー コントローラーと、選択する他のビュー コントローラーとの間でセグエを定義することです。選択したセグメントに基づいて決定しperformSegueWithIdentifier:sender:
、セグメントに一致する識別子を使用してコントローラーのコードから呼び出します。
どのコントローラーが組み込みコントローラーであるかを切り替えたい場合は、Apple が使用するカスタム コンテナー ビュー コントローラー パラダイムを使用する必要があると思います。以下のコードは、それを行う小さなテストアプリからのものです。これは、単一のコントローラー テンプレートを使用してセットアップされ、コンテナー ビューがそのコントローラー (ViewController と呼ばれる) に追加され、セグメント化されたコントロールがメイン ビューに追加されました。次に、切断されたビュー コントローラーを追加し、そのサイズを自由形式に変更してから、そのビュー サイズを埋め込みコントローラーのビュー サイズと同じになるように調整しました。ViewController.h のコードは次のとおりです。
@interface ViewController : UIViewController
@property (weak,nonatomic) IBOutlet UIView *container;
@property (strong,nonatomic) UIViewController *initialVC;
@property (strong,nonatomic) UIViewController *substituteVC;
@property (strong,nonatomic) UIViewController *currentVC;
@end
そして、これは私がViewController.mに持っているものです:
- (void)viewDidLoad {
[super viewDidLoad];
self.initialVC = self.childViewControllers.lastObject;
self.substituteVC = [self.storyboard instantiateViewControllerWithIdentifier:@"Substitute"];
self.currentVC = self.initialVC;
}
-(IBAction)SwitchControllers:(UISegmentedControl *)sender {
switch (sender.selectedSegmentIndex) {
case 0:
if (self.currentVC == self.substituteVC) {
[self addChildViewController:self.initialVC];
self.initialVC.view.frame = self.container.bounds;
[self moveToNewController:self.initialVC];
}
break;
case 1:
if (self.currentVC == self.initialVC) {
[self addChildViewController:self.substituteVC];
self.substituteVC.view.frame = self.container.bounds;
[self moveToNewController:self.substituteVC];
}
break;
default:
break;
}
}
-(void)moveToNewController:(UIViewController *) newController {
[self.currentVC willMoveToParentViewController:nil];
[self transitionFromViewController:self.currentVC toViewController:newController duration:.6 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{}
completion:^(BOOL finished) {
[self.currentVC removeFromParentViewController];
[newController didMoveToParentViewController:self];
self.currentVC = newController;
}];
}