SWRevealViewController – RightViewController

Estoy usando SWRevealViewController para implementar dos vistas de navigation lateral en mi aplicación. Seguí el método del tablero de historias e implementé con éxito la vista trasera y la vista frontal. Intenté configurar la vista correcta exactamente como la vista trasera a través de storyboard, pero no pude hacerlo.

He configurado el controller de visualización de revelado segue a "sw_right", pero parece que no está siendo reconocido por - (void)prepareForSegue:(SWRevealViewControllerSegue *)segue sender:(id)sender que se llama dos veces para "sw_rear" y "sw_front "

¿Qué me estoy perdiendo? introduzca la descripción de la imagen aquí

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

introduzca la descripción de la imagen aquí

aquí está el proyecto de muestra, esto está funcionando bien, he trabajado para usted, el enlace de descarga es

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

Después de download el proyecto, desea eliminar el proyecto, use este enlace.

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

aquí se necesitaba el desplazamiento correcto en el controller de vista frontal, agregue UIBarButtonItem en el controller de vista particular

  @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 

y agrega algunas funciones es 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]; } 

Rápido

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

Me di count de cuál era el problema. En el método loadStoryboardControllers [self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil]; fue comentado Si implementamos el controller de vista derecha, esto debe ser descomentado.

Me pidió que mirara este hilo.

No tengo experiencia con storyboards.

Por lo tanto, estoy pegando debajo del código que tengo en mis proyectos que permiten el lado derecho. Echa un vistazo a la sección que comenté. Con suerte, esto te pondrá en el path correcto.

Buena suerte

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

Hay una condición try-catch entre la línea en 435 a 444 en SWRevealViewController.m. Simplemente reorganice la statement de la siguiente manera

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

Ahora mi menu-derecho / rightViewController está funcionando aunque no estoy usando el leftmenu / rearViewController.

También puedes hacer lo que Shad sugirió. Pero si está recibiendo una bandera con el derecho, simplemente puede 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) {} } } 

con

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

como puedes ver comenté

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

porque esa es la que te da un problema. Si es la parte delantera o trasera, puedes hacer lo mismo.