使用Xcode 4.2 Storyboard,我刚刚在一个包含两个段的视图中创建了一个分段控件。然后我按住Ctrl键从每个段拖动到一个单独的视图以创建两个segues。似乎开发人员忘记区分段,因为只能创建一个segue;尝试创建第二个“其他”控制段导致第一个segue被第二个替换。有没有人有一个Storyboard解决方法,或者我必须手动编写代码吗?
谢谢。
答案 0 :(得分:2)
4.2现已公开发布。
使用自定义segue可以解决问题。在自定义segue中,可以测试分段控制以确定要调用哪个控制器。我测试了以下自定义segue:
#import "FlipTopPop.h"
@interface UIViewController (Extension)
@property (strong, nonatomic) IBOutlet UISegmentedControl *tabControl;
@end
@implementation FlipTopPop
- (void) perform {
UIViewController *src = (UIViewController *) self.sourceViewController;
switch (src.tabControl.selectedSegmentIndex) {
case 0:
// go to settings
src.tabControl.selectedSegmentIndex = 1; //not yet implemented - for now don't segway - reset to index 1 for now
break;
case 1:
// this controller is called with index 1 - do nothing - should not get here
break;
case 2: {
[UIView transitionWithView:src.navigationController.view duration:0.5
options:UIViewAnimationOptionTransitionFlipFromTop
animations:^{
[src.navigationController popViewControllerAnimated:NO];
}
completion:NULL];
}
break;
default:
break;
}
}
@end
请注意,我还没有在案例0(段0)中实现转换,它将转换到另一个控制器,其代码类似于案例2中实现的代码。
答案 1 :(得分:0)
我通过以下方式解决了这种情况。我将分段控件添加到故事板中的工具栏中。必须首先添加一个条形按钮,然后将分段控件添加到该按钮。我的段控件有3个段,每个段将您带到不同的视图。当前视图代表了对两个其他视图留下两个segue的要求。然后我在工具栏右侧的视图中创建了两个按钮。我控制从那些控制器点击到两个目标控制器以创建两个所需的segue。我还在下面的代码中将“值已更改”发送操作附加到IBAction。其余部分在代码中实现如下:
- (IBAction)segmentChanged:(id)sender {
switch (self.segmentedControl.selectedSegmentIndex) {
case 0:
[self performSegueWithIdentifier: @"goToSettings" sender: self];
break;
case 1:
// aready here - do nothing
break;
case 2:
[self performSegueWithIdentifier: @"returnToNotes"
sender: self];
break;
default:
break;
}
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"goToSettings"]) {
[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
// do nothing special
}
if ([[segue identifier] isEqualToString:@"returnToNotes"]) {
// do nothing special
}
}
还必须保持选择的段索引以显示当前所在的视锥。这是通过viewWillAppear方法中的以下语句完成的:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.segmentedControl.selectedSegmentIndex = 1; // the index for the current view
}
在由分段控件选择的三个视图控制器中的每一个中实现类似的代码。此解决方案与在代码中完成所有操作没有太大区别,但具有故事板反映视图和视图转换(segue)的优势。