SWRevealViewController – RightViewController

我正在使用SWRevealViewController在我的应用程序中实现两侧导航视图。 我遵循故事板方法,成功实现了后视图和前视图。 我试图通过故事板完全像后视图设置正确的看法,但不能做到这一点。

我已经把显示视图控制器segue设置为“sw_right”,但是看起来它没有被- (void)prepareForSegue:(SWRevealViewControllerSegue *)segue sender:(id)sender所识别- (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]; }; } } } 

在这里输入图像说明

这里是示例项目,这是工作正常我为你自己,下载链接是

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 

并添加一些function是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]; } 

迅速

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

我找出了问题所在。 在loadStoryboardControllers方法中[self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil]; 被评论了。 如果我们实现正确的视图控制器,这个必须被注释掉。

你要求我看看这个线程。

我没有故事板的经验。

所以,我粘贴在我的项目的代码,允许右手边。 看看我评论的部分。 希望这会使你走上正确的道路。

祝你好运

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

在SWRevealViewController.m的435到444行之间有一个try-catch条件。 只需重新安排如下的声明

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

现在我的右键菜单/右视图控制器工作,即使我不使用leftmenu / rearViewController。

你也可以做什么sha鱼build议。 但是如果你拿到一个正确的标志,你可以更换

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

因为那是给你一个问题。 如果它的前面或后面你可以做同样的事情