【问题标题】:XCode 4.2 + iOS 5 Storyboard : Can't distinguish between segmented control sections as segue initiators?XCode 4.2 + iOS 5 Storyboard:不能区分分段控制部分作为 segue 发起者?
【发布时间】:2011-10-10 11:59:43
【问题描述】:

使用 Xcode 4.2 Storyboard,我刚刚在具有两个段的视图中创建了一个分段控件。然后我 ctrl-drag 从每个段到一个单独的视图以创建两个 segue。不过,开发人员似乎忘记了区分这些段,因为只能创建一个 segue;试图为“其他”控制段创建第二个会导致第一个 segue 被第二个替换。有没有人为此提供 Storyboard 解决方法,还是我必须手动编写代码?

谢谢。

【问题讨论】:

  • Ew... 我想 4.2 仍处于 NDA 之下,对吧?也许 Apple Dev 论坛是提出这个问题的正确地方。

标签: xcode controls storyboard


【解决方案1】:

4.2 现已公开发布。

这个问题可以通过 Storyboard 使用自定义 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 中实现的代码。

【讨论】:

  • 感谢 TJ 如此透彻的分享。
【解决方案2】:

我通过以下方式解决了这种情况。我将分段控件添加到情节提要的工具栏中。这必须首先通过添加一个条形按钮然后添加分段控件来完成。我的段控件有 3 个段,每个段都将您带到不同的视图。当前的观点代表了那些对其他两个观点提出两个要求的观点。然后,我在工具栏右侧的视图之外创建了两个按钮。我控制从那些到两个目标控制器的单击以创建两个所需的 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
}

在分段控件选择的三个视图控制器中的每一个中都实现了类似的代码。此解决方案与在代码中完成所有操作没有太大区别,但具有故事板反映视图和视图转换(segues)的优势。

【讨论】:

    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多