segue change destinationViewController

时间:2012-11-28 18:49:41

标签: ios uisegmentedcontrol uistoryboard

有没有办法改变segue准备segue时要调用的控制器?当使用嵌入的segue更改分段控件时,我正在尝试这样做。谢谢!

2 个答案:

答案 0 :(得分:8)

您可能已经注意到segue的destinationViewControllerreadonly。您更好的策略是在保存分段控件(不是视图或控件)的视图控制器和您要选择的其他视图控制器之间定义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;
                            }];
}