4

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

4

2 回答 2

8

您可能已经注意到 segue 的destinationViewControlleris readonly。您更好的策略是在包含分段控件(不是视图或控件)的视图控制器和您想要选择的其他视图控制器之间定义 segues。根据所选段做出决定,并performSegueWithIdentifier:sender:使用与段匹配的标识符从控制器代码中调用。

于 2012-11-28T19:07:45.433 回答
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;
                            }];
}
于 2012-11-29T17:13:47.310 回答