【问题标题】:SWRevealViewController - RightViewControllerSWRevealViewController - RightViewController
【发布时间】:2014-08-22 10:00:18
【问题描述】:

我正在使用SWRevealViewController 在我的应用程序中实现两个侧边导航视图。我按照故事板的方法,成功实现了后视图和前视图。我尝试通过情节提要设置与后视图完全相同的右视图,但无法做到。

我已将显示视图控制器 segue 设置为“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];
        };
    }
  }
}

【问题讨论】:

  • 你在 nw 遇到的实际问题是什么
  • 我认为你没有滑动右视图控制器,正确
  • @Anbu.Karthik 我只使用栏按钮来显示和隐藏后视图和右视图。当我在故事板中将显示视图控制器 segue id 设置为sw_right 时,未设置 rightViewController。除了添加自定义转场之外,我还应该在故事板中添加什么?
  • 关于这个问题的任何想法stackoverflow.com/questions/31481559/…

标签: ios objective-c iphone swift swrevealviewcontroller


【解决方案1】:

这里是示例项目,我为你自己设计的很好,下载链接是

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

斯威夫特

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

【讨论】:

  • 关于这个问题的任何想法stackoverflow.com/questions/31481559/…
  • @Anbu- 我只是发现您提供的链接无法下载项目,让我知道当 SWreveal View 控制器不是您的初始视图时如何实现侧边栏。因为当我推动它时,它会在视图本身的上方显示它自己的导航栏。
【解决方案2】:

我发现了问题所在。在loadStoryboardControllers 方法[self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil]; 被注释掉了。如果我们实现右视图控制器,则必须取消注释。

【讨论】:

【解决方案3】:

你要求我看这个帖子。

我没有故事板的经验。

所以,我将粘贴在我的项目中允许右侧的代码下方。 看看我评论的部分。希望这会让您走上正确的道路。

祝你好运

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

【讨论】:

  • 非常感谢您的帮助!会试一试,让你知道!
  • 此方法有效。但是我通过故事板添加的视图不可见。知道这是为什么吗?
  • 我搞定了。我已经回答了问题所在。非常感谢您的帮助:)
  • 关于这个问题的任何想法stackoverflow.com/questions/31481559/…
【解决方案4】:

在 SWRevealViewController.m 的 435 到 444 行之间有一个 try-catch 条件。只需将语句重新排列如下

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

现在我的右菜单/右视图控制器正在工作,即使我没有使用左菜单/后视图控制器。

【讨论】:

    【解决方案5】:

    您也可以按照 shad 的建议进行操作。但是如果你得到一个正确的标志,你可以替换

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

    因为那是给您带来问题的人。如果是前面或后面,你也可以这样做

    【讨论】:

    猜你喜欢
    • 2017-05-21
    • 2014-07-17
    • 2015-03-06
    • 2018-01-24
    • 2014-06-30
    • 2016-11-19
    • 2016-03-10
    相关资源
    最近更新 更多