XCode 4.2 + iOS 5故事板:无法区分分段控制部分作为segue启动器?

时间:2011-10-10 11:59:44

标签: xcode controls storyboard

使用Xcode 4.2 Storyboard,我刚刚在一个包含两个段的视图中创建了一个分段控件。然后我按住Ctrl键从每个段拖动到一个单独的视图以创建两个segues。似乎开发人员忘记区分段,因为只能创建一个segue;尝试创建第二个“其他”控制段导致第一个segue被第二个替换。有没有人有一个Storyboard解决方法,或者我必须手动编写代码吗?

谢谢。

2 个答案:

答案 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)的优势。