转场改变目标视图控制器

4
有没有办法在prepareForSegue中更改segue将要调用的控制器?我正在尝试在嵌入式segue中更改分段控件时实现这个功能。谢谢!

你是想更改嵌入在容器视图中的控制器,还是尝试从嵌入的视图控制器执行不同的segue? - rdelmar
是的,我正在尝试根据片段选择更改嵌入式控制器。谢谢回复。 - Cocoa Nub
2个回答

8
正如你可能已经注意到的,segue 的 destinationViewController 是只读的。更好的策略是在持有分段控制器(不是视图或控件)的视图控制器和你想要选择的其他视图控制器之间定义 segues。根据所选的段落做出决定,并从控制器的代码中调用与段落匹配的标识符的 performSegueWithIdentifier:sender: 方法。

谢谢您的回复。我还能用这种方式嵌入子视图控制器吗?我想在切换段时嵌入一个,并切换到另一个。 - Cocoa Nub

5
如果您想切换嵌入式控制器,则需要使用苹果使用的自定义容器视图控制器范例。下面的代码来自一个小型测试应用程序,可以实现这一点。这是使用单个控制器模板设置的,然后向该控制器(称为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;
                            }];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接