XCode 4.2 + iOS 5 Storyboard: не можете отличить сегментированные разделы управления от инициаторов перехода? - PullRequest
0 голосов
/ 10 октября 2011

Используя Xcode 4.2 Storyboard, я только что создал сегментированный элемент управления в виде с двумя сегментами. Затем я перетаскиваю Ctrl из каждого сегмента в отдельный вид, чтобы создать два сегмента. Похоже, разработчики забыли различать сегменты, поскольку можно создать только один переход; попытка создать второй для «другого» управляющего сегмента приводит к замене первого перехода вторым. У кого-нибудь есть обходной путь Раскадровки для этого, или я должен написать код вручную?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

4.2 уже опубликован.

Проблема может быть решена с помощью раскадровки, используя пользовательский переход. В пользовательском разделе сегментированный элемент управления может быть проверен, чтобы определить, какой контроллер вызывать. Я проверил следующий пользовательский переход:

#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.

0 голосов
/ 17 ноября 2011

Я решил эту ситуацию следующим образом.Я добавил сегментированный элемент управления на панель инструментов в раскадровке.Это нужно сделать сначала, добавив кнопку бара, а затем добавив к ней сегментированный элемент управления.У моего элемента управления сегментами есть 3 сегмента, каждый из которых ведет вас в другое представление.Текущее представление представляет собой одно из тех, которые оставляют требование для двух переходов к двум другим представлениям.Затем я создал две кнопки из вида справа на панели инструментов.Я управляю щелчком этих двух контроллеров назначения, чтобы создать два требуемых сегмента.Я также прикрепил отправленное действие «значение изменено» к 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:1004 *

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.segmentedControl.selectedSegmentIndex = 1; // the index for the current view
}

Аналогичный код реализован в каждом из трех контроллеров представления, выбранных сегментированным элементом управления.Это решение не сильно отличается от того, как все это делается в коде, но имеет то преимущество, что раскадровка отражает представления и переходы (сегменты) представления.

...