以编程方式设置segue标识符

时间:2014-04-09 11:40:39

标签: ios ios7 interface-builder

假设我有一个带有textField和一个按钮的ViewController。

我想使用unwind segue,所以我点击按钮后可以将textField的信息提供给我的其他viewController。

我想使用PrepareForSegue方法,所以我可以在文本中保存textField中的文本,然后再解开" m" unwiding"。

如何手动为我的segue设置标识符?如果它是一个栏按钮项我可以使用IB来设置标识符(例如,"保存"然后使用它)。情况并非如此,只是常规按钮。

2 个答案:

答案 0 :(得分:4)

无法以编程方式创建segues。没有故事板,它们就不存在。

请参阅this question

答案 1 :(得分:-2)

您可以通过编程方式轻松添加segue(不使用故事板)。在源视图控制器头文件中:

@property (nonatomic, strong) UIStoryboardSegue *segue;

在源视图控制器实现文件中,相应地设置segue属性:

self.segue = [UIStoryboardSegue segueWithIdentifier:[NSString stringWithFormat:@"%lu", indexPath.item] source:self destination:[PlayerViewController sharedPlayerViewController] performHandler:^{
       // Insert whatever; nothing is needed for a basic segue
    }];

此外,在源视图控制器中,使用prepareForSegue方法添加目标视图控制器设置和转换:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// The code in this method both sets up the destination view controller and transitions to it; you could optionally do set up here only, and then transition in an overridden -(void)perform method. This way is more convenient.
     [(PlayerViewController *)segue.destinationViewController setView:[PlayerView sharedPlayerView]];
     PHAsset *phAsset = (PHAsset *)AppDelegate.assetsFetchResults[segue.identifier.integerValue];
     [AppDelegate.cacheManager requestAVAssetForVideo:phAsset options:AppDelegate.videoOptions resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
         [[PlayerView sharedPlayerView] addSubview:[PlayerControls sharedPlayerControls]];
         [[PlayerControls sharedPlayerControls] setDelegate:(PlayerViewController *)segue.destinationViewController];
         [[PlayerView sharedPlayerView] addSubview:[AppDelegate playerControlsLabel]];
         [(PlayerViewController *)segue.destinationViewController setupPlaybackForAsset:asset completion:^{
             [((AssetsCollectionViewController *)sender).navigationController presentViewController:(PlayerViewController *)segue.destinationViewController animated:TRUE completion:^{
             }];
         }];
     }];
}

此外,在源视图控制器实现文件中的任何位置添加此行以执行segue:

[self prepareForSegue:self.segue sender:self];

prepareForSegue方法的调用可以在IBAction处理程序内部和其他任何地方进行。

请注意,显示目标视图控制器的代码引用未在故事板中设置的视图控制器;从中获取此代码的项目不会使用故事板。但是,因为 segue代码是相同的,所以这很重要。

另请注意,您无需以任何方式,形状或形式修改目标视图控制器。以编程方式创建展开segue(换句话说,构建在此处显示的单向segue):

@implementation RootNavigationController

- (UIStoryboardSegue*)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {
    return [toViewController segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];
}

@end

现在,这就是我在自己的应用中所做的事情;这是其他人在不使用故事板的情况下创建segue所做的事情(而不是完全没有故事板):

- (void)presentSignupViewController {
    // Storyboard ID
    UIStoryboard *modalStoryboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil];
    UINavigationController *navController = [modalStoryboard instantiateViewControllerWithIdentifier:@"MySignupViewController"];
    MySignupViewController *controller = [navController viewControllers][0];

    // Configure your custom view controller, e.g. setting delegate
    controller.delegate = self;

    // Show VC
    navController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

    BlurryModalSegue *segue = [[BlurryModalSegue alloc] initWithIdentifier:@"SignupScene" source:self destination:navController];

    [segue perform];
}

区别仅在于使用perform和prepareForSegue:当根本不使用故事板时,你必须在performForSegue方法中调用你选择的转换方法(push ...或present ...);但是,执行方法会为您调用transition方法。



<iframe width="853" height="480" src="https://www.youtube.com/embed/y8Fu2PEO2zo?rel=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe>
&#13;
&#13;
&#13;