有没有办法改变segue准备segue时要调用的控制器?当使用嵌入的segue更改分段控件时,我正在尝试这样做。谢谢!
答案 0 :(得分:8)
您可能已经注意到segue的destinationViewController
是readonly
。您更好的策略是在保存分段控件(不是视图或控件)的视图控制器和您要选择的其他视图控制器之间定义segue。根据选定的细分做出决定,并使用与细分受众群匹配的标识符从控制器代码中调用performSegueWithIdentifier:sender:
。
答案 1 :(得分:5)
如果要切换哪个控制器是嵌入式控制器,那么我认为您需要使用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;
}];
}