SWRevealViewController – RightViewController

J'utilise SWRevealViewController pour implémenter deux vues de navigation latérales dans mon application. J'ai suivi la méthode du story board et mis en place avec succès la vue arrière et la vue de face. J'ai essayé de régler la vue de droite exactement comme la vue arrière via le storyboard, mais je n'ai pas pu le faire.

J'ai mis le controller de vue de révélation segue à "sw_right" mais on dirait qu'il n'est pas reconnu par - (void)prepareForSegue:(SWRevealViewControllerSegue *)segue sender:(id)sender qui est appelé deux fois pour "sw_rear" et "sw_front" "

Qu'est-ce que je rate? entrez la description de l'image ici

 - (void)prepareForSegue:(SWRevealViewControllerSegue *)segue sender:(id)sender { // $ using a custom segue we can get access to the storyboard-loaded rear/front view controllers // the sortingck 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. NSSsortingng *identifier = segue.identifier; if ( [segue isKindOfClass:[SWRevealViewControllerSegue class]] && sender == nil ) { if ( [identifier isEqualToSsortingng:SWSegueRearIdentifier] ) { segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) { [self _setRearViewController:dvc animated:NO]; }; } else if ( [identifier isEqualToSsortingng: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 isEqualToSsortingng:SWSegueRightIdentifier] ) { segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) { [self _setRightViewController:dvc animated:NO]; }; } } } 

entrez la description de l'image ici

Voici l'exemple de projet, cela fonctionne bien, j'ai travaillé pour vous, le lien de téléchargement est

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

après avoir téléchargé le projet vous voulez supprimer le projet, utilisez ce lien

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

ici vous UIBarButtonItem besoin de la glissière droite sur le controller de vue de face, ajoutez le UIBarButtonItem dans la vue particulière

  @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 

et ajoutez les certaines fonctions est 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]; } 

Rapide

 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) } 

J'ai compris quel était le problème. Dans la méthode loadStoryboardControllers [self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil]; a été commenté. Si nous implémentons le controller de vue de droite, cela doit être décommenté.

Vous avez demandé que je regarde ce fil.

Je n'ai pas d'expérience avec les storyboards.

Donc, je colle sous le code que j'ai dans mes projets qui permettent le côté droit. Jetez un oeil à la section que j'ai commenté. J'espère que cela vous mettra sur le bon path.

Bonne chance

 - (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; } 

Il existe une condition try-catch entre la ligne sur 435 et 444 sur SWRevealViewController.m. Il suffit de réorganiser la déclaration comme suit

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

Maintenant, mon right-menu / rightViewController fonctionne même si je n'utilise pas le leftmenu / rearViewController.

vous pouvez aussi faire ce que shad a suggéré. Mais si vous obtenez un drapeau avec le droit, vous pouvez simplement replace

 - (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) {} } } 

avec

  - (void)loadStoryboardControllers { //[self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil]; [self performSegueWithIdentifier:SWSegueFrontIdentifier sender:nil]; [self performSegueWithIdentifier:SWSegueRearIdentifier sender:nil]; } 

comme vous pouvez le voir, j'ai commenté

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

parce que c'est celui qui vous donne un problème. Si c'est l'avant ou l'arrière, vous pouvez faire la même chose