假设我有一个带有textField和一个按钮的ViewController。
我想使用unwind segue,所以我点击按钮后可以将textField的信息提供给我的其他viewController。
我想使用PrepareForSegue方法,所以我可以在文本中保存textField中的文本,然后再解开" m" unwiding"。
如何手动为我的segue设置标识符?如果它是一个栏按钮项我可以使用IB来设置标识符(例如,"保存"然后使用它)。情况并非如此,只是常规按钮。
答案 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&showinfo=0" frameborder="0" allowfullscreen></iframe>
&#13;