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

Я установил переход контроллера представления на "sw_right", но похоже, что он не распознается - (void)prepareForSegue:(SWRevealViewControllerSegue *)segue sender:(id)sender, который вызывается дважды для "sw_rear" и "sw_front"

Что мне не хватает? введите описание изображения здесь

- (void)prepareForSegue:(SWRevealViewControllerSegue *)segue sender:(id)sender
{
// $ using a custom segue we can get access to the storyboard-loaded rear/front view controllers
// the trick is to define segues of type SWRevealViewControllerSegue on the storyboard
// connecting the SWRevealViewController to the desired front/rear controllers,
// and setting the identifiers to "sw_rear" and "sw_front"

// $ these segues are invoked manually in the loadView method if a storyboard
// was used to instantiate the SWRevealViewController

// $ none of this would be necessary if Apple exposed "relationship" segues for container view controllers.

NSString *identifier = segue.identifier;
if ( [segue isKindOfClass:[SWRevealViewControllerSegue class]] && sender == nil )
{
    if ( [identifier isEqualToString:SWSegueRearIdentifier] )
    {
        segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc)
        {
            [self _setRearViewController:dvc animated:NO];
        };
    }
    else if ( [identifier isEqualToString:SWSegueFrontIdentifier] )
    {
        segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc)
        {
            [self _setFrontViewController:dvc animated:NO];

        };
    }
    //This is never executed even after setting the identifier
    else if ( [identifier isEqualToString:SWSegueRightIdentifier] ) 
    {
        segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc)
        {
            [self _setRightViewController:dvc animated:NO];
        };
    }
  }
}
4
LoveMeSomeFood 1 Июл 2014 в 22:35

5 ответов

Лучший ответ

Я понял, в чем проблема. В loadStoryboardControllers метод [self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil]; был закомментирован. Если мы реализуем правый контроллер представления, это нужно раскомментировать.

5
LoveMeSomeFood 3 Июл 2014 в 15:42

enter image description here

Вот образец проекта, он работает нормально, я разработал для себя, ссылка для скачивания

https://www.sendspace.com/file/0l2ndd

После загрузки проекта вы хотите удалить проект, используйте эту ссылку

https://www.sendspace.com/delete/0l2ndd/1b1bd537ad852b2fdea9b9a0cce3390f

Здесь вам нужно было провести правой рукой по контроллеру вида спереди, добавить UIBarButtonItem в конкретный контроллер вида

    @property (strong, nonatomic) IBOutlet UIBarButtonItem *rightIcon;   //this is for left bar button Item
    @property (nonatomic) IBOutlet UIBarButtonItem* revealButtonItem;  //this is for right bar button Item

И добавьте некоторые функции: View DidLoad

- (void)viewDidLoad
{
[super viewDidLoad];

 //action for left Swipe
[self.revealButtonItem setTarget: self.revealViewController];
[self.revealButtonItem setAction: @selector( revealToggle: )];
[self.navigationController.navigationBar addGestureRecognizer:  self.revealViewController.panGestureRecognizer];

//action for Right Swipe
[self.rightIcon setTarget: self.revealViewController];
[self.rightIcon setAction: @selector( rightRevealToggle: )];
[self.navigationController.navigationBar addGestureRecognizer: self.revealViewController.panGestureRecognizer];
}

Swift

override func viewDidLoad() {
super.viewDidLoad()
//action for left Swipe
self.revealButtonItem.target = self.revealViewController
self.revealButtonItem.action = "revealToggle:"
    self.navigationController.navigationBar.addGestureRecognizer(self.revealViewController.panGestureRecognizer)
//action for Right Swipe
self.rightIcon.target = self.revealViewController
self.rightIcon.action = "rightRevealToggle:"
    self.navigationController.navigationBar.addGestureRecognizer(self.revealViewController.panGestureRecognizer)
}
9
Anbu.Karthik 18 Май 2016 в 05:43

Вы просили меня посмотреть эту ветку.

У меня нет опыта работы с раскадровками.

Итак, я вставляю ниже код, который у меня есть в моих проектах, который позволяет использовать правую сторону. Взгляните на раздел, который я прокомментировал. Надеюсь, это наставит вас на правильный путь.

Удачи

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
{
    UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window = window;

    FrontViewController *frontViewController = [[FrontViewController alloc] init];
    RearViewController *rearViewController = [[RearViewController alloc] init];

    UINavigationController *frontNavigationController = [[UINavigationController alloc] initWithRootViewController:frontViewController];
    UINavigationController *rearNavigationController = [[UINavigationController alloc] initWithRootViewController:rearViewController];

    SWRevealViewController *revealController = [[SWRevealViewController alloc] initWithRearViewController:rearNavigationController     frontViewController:frontNavigationController];
    revealController.delegate = self;

// THIS SECTION RIGHT BELOW IS PROBABLY WHAT YOU WANT TO LOOK AT
    RightViewController *rightViewController = rightViewController =     [[RightViewController alloc] init];
    rightViewController.view.backgroundColor = [UIColor greenColor];

    revealController.rightViewController = rightViewController;

    revealController.bounceBackOnOverdraw=NO;
    revealController.stableDragOnOverdraw=YES;

    self.viewController = revealController;

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}
1
Timothy Jeffcoat 2 Июл 2014 в 16:28

Между строками с 435 по 444 на SWRevealViewController.m есть условие try-catch. Просто измените формулировку следующим образом

        [self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil];
        [self performSegueWithIdentifier:SWSegueFrontIdentifier sender:nil];
        [self performSegueWithIdentifier:SWSegueRearIdentifier sender:nil];

Теперь мое правое меню / rightViewController работает, хотя я не использую leftmenu / rearViewController.

1
Shad 6 Ноя 2014 в 06:04

Вы также можете сделать то, что предложил шед. Но если вы получаете флаг с правом, вы можете просто заменить

- (void)loadStoryboardControllers


if ( self.storyboard && _rearViewController == nil )
{
    //Try each segue separately so it doesn't break prematurely if either Rear or Right views are not used.
    @try
    {
        [self performSegueWithIdentifier:SWSegueRearIdentifier sender:nil];
    }
    @catch(NSException *exception) {}

    @try
    {
        [self performSegueWithIdentifier:SWSegueFrontIdentifier sender:nil];
    }
    @catch(NSException *exception) {}

    @try
    {
        [self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil];
    }
    @catch(NSException *exception) {}
}


}

С участием

 - (void)loadStoryboardControllers
{

//[self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil];
[self performSegueWithIdentifier:SWSegueFrontIdentifier sender:nil];
[self performSegueWithIdentifier:SWSegueRearIdentifier sender:nil];

}

Как вы можете видеть, я закомментировал

//[self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil];

Потому что это тот, который вызывает у вас проблему. Если это спереди или сзади, вы можете сделать то же самое

1
Miguel 31 Май 2015 в 18:04