【问题标题】:SWRevealViewController causes infinite loop initializingSWRevealViewController 导致无限循环初始化
【发布时间】:2017-04-21 00:17:49
【问题描述】:

我已经使用 SWRevealViewController 库很久了,没有任何问题,我真的很喜欢它! 这次我不得不将它添加到一个项目中,所以这就是我所做的:

  • 我采用了“RevealControllerExample”示例。
  • 我已将 SWRevealViewController.h/.m 直接复制到我的项目中。
  • 我已将 FrontViewController.h/.m/.xib 直接复制到我的项目中 我已将 RearViewController.h/.m/.xib 直接复制到我的项目中,但我删除了 didSelectRowAtIndexPath 中的所有代码(我不需要暂时)。
  • 我忽略了 RightViewController,因为我不需要它。
  • 我已将所有初始化代码添加到我的 AppDelegate:didFinishLaunchingWithOptions 中,但 RightViewController 的初始化代码除外,因为我不需要它。

这就是我的初始化代码:

    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;


    self.swViewController = revealController;

    self.window.rootViewController = self.swViewController;
    [self.window makeKeyAndVisible];
    return YES;

当我启动应用程序时,由于无限循环而崩溃。这是调用堆栈:

...(here comes inifite calls to transitionFromViewController)...
#36603 0x00118620 in __80-[SWRevealViewController _transitionFromViewController:toViewController:inView:]_block_invoke_2 at /path/to/myproject/SWRevealViewController.m:1683
#36604 0x00118620 in __80-[SWRevealViewController _transitionFromViewController:toViewController:inView:]_block_invoke_2 at /path/to/myproject/SWRevealViewController.m:1683
#36605 0x00118620 in __80-[SWRevealViewController _transitionFromViewController:toViewController:inView:]_block_invoke_2 at /path/to/myproject/SWRevealViewController.m:1683
#36606 0x00118620 in __80-[SWRevealViewController _transitionFromViewController:toViewController:inView:]_block_invoke_2 at /path/to/myproject/SWRevealViewController.m:1683
#36607 0x00118620 in __80-[SWRevealViewController _transitionFromViewController:toViewController:inView:]_block_invoke_2 at /path/to/myproject/SWRevealViewController.m:1683
#36608 0x00118620 in __80-[SWRevealViewController _transitionFromViewController:toViewController:inView:]_block_invoke_2 at /path/to/myproject/SWRevealViewController.m:1683
#36609 0x00118620 in __80-[SWRevealViewController _transitionFromViewController:toViewController:inView:]_block_invoke_2 at /path/to/myproject/SWRevealViewController.m:1683
#36610 0x00118620 in __80-[SWRevealViewController _transitionFromViewController:toViewController:inView:]_block_invoke_2 at /path/to/myproject/SWRevealViewController.m:1683
#36611 0x00118620 in __80-[SWRevealViewController _transitionFromViewController:toViewController:inView:]_block_invoke_2 at /path/to/myproject/SWRevealViewController.m:1683
#36612 0x00118620 in __80-[SWRevealViewController _transitionFromViewController:toViewController:inView:]_block_invoke_2 at /path/to/myproject/SWRevealViewController.m:1683
#36613 0x00118620 in __80-[SWRevealViewController _transitionFromViewController:toViewController:inView:]_block_invoke_2 at /path/to/myproject/SWRevealViewController.m:1683
#36614 0x0011759c in __82-[SWRevealViewController _performTransitionOperation:withViewController:animated:]_block_invoke at /path/to/myproject/SWRevealViewController.m:1470
#36615 0x0011757e in -[SWRevealViewController _performTransitionOperation:withViewController:animated:] at /path/to/myproject/SWRevealViewController.m:1497
#36616 0x001137be in -[SWRevealViewController initWithRearViewController:frontViewController:] at /path/to/myproject/SWRevealViewController.m:635
#36617 0x000e1ec0 in -[AppDelegate application:didFinishLaunchingWithOptions:] at /path/to/myproject/AppDelegate.m:35

我已经直接测试了样本,当然它可以工作。 我正在使用 Xcode 8,并且正在使用 iOS 10.1 进行编译。 我正在做的唯一“不同”的事情是我的应用程序只是横向的,我不知道这是否会影响侧边菜单。

会发生什么?

【问题讨论】:

  • 您需要将SWRevealViewController 与您的项目集成,并且只需要左侧导航?
  • 是的,就是这样。我需要一个左侧导航。我为了同样的目的多次使用这个库没有问题,但这次我不知道它发生了什么。
  • 其实我已经用故事板做了好几次了
  • 我真的很感激。我可以试试你的代码。
  • 感谢 vaibhav!我会尽快尝试您的解决方案,并告诉您情况如何。我不是直接使用 Storyboard 而是 ViewControllers,我希望我可以调整你的解决方案。

标签: ios objective-c swrevealviewcontroller


【解决方案1】:

使用SWRevealViewController library 左侧滑动菜单的代码现在有一些变化,为了正确使用,请遵循以下一些棘手的步骤。

类配置:

  1. 在您的项目及其情节提要中添加一些类download link

    • SWRevealViewController.h
    • SWRevealViewController.m
    • SidebarViewController.h
    • SidebarViewController.m
  2. 要创建前视图和稀有视图,请参阅故事板配置。

  3. 要在菜单中添加更多viewControllers,首先需要创建可可类并添加以下代码。

    • 在 .h 文件中创建侧边按钮的 IBOutlet,用于稍后导航。
    • 导入"SWRevealViewController.h"

      @property (weak, nonatomic) IBOutlet UIBarButtonItem *sidebarButton;
      
    • 在.m文件中,在viewDidLoad方法中添加如下代码:

      // Change button color
      _sidebarButton.tintColor = [UIColor colorWithWhite:0.1f alpha:0.9f];
      
      // Set the side bar button action. When it's tapped, it'll show up the sidebar.
      _sidebarButton.target = self.revealViewController;
      _sidebarButton.action = @selector(revealToggle:);
      
      // Set the gesture
      [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
      

Stroyboard 配置:

  1. 为了拍正面图viewController

    • 使用 segue 从Reveal View Controller 连接任何vc 并选择reveal view controller 查看内图:

    • 然后必须将上述seugue的标识符设置为sw_front见图:

  2. 要将其他 viewController 配置为菜单,您必须使用 segue 将它们从 Sidebar scene vc's 单元格连接起来,而无需像第一张图像一样使用标识符。

  3. 点击前连接所有sidebarButtonIBOutlet

  4. 要添加更多 viewController,您需要在 Sidebar scene vc 中添加单元格并在 SidebarViewController.m 类中找到的 menuItems 数组中进行一些更改,但不要忘记使该单元格 identifire 与 menuItmes 相同。

    menuItems = @[@"title", @"news", @"comments", @"map", @"calendar", @"wishlist", @"bookmark", @"tag", @"anotherVc_1", @"anotherVc_2"];
    

注意:您可以从 SidebarViewController.m 类中删除 prepareForSegue 方法,并为所有单元格制作单独的 vc 以进行转换,prepareForSegue 方法处理 segue 传输,该方法正在重定向用户,因此具有差异外观的相同 vc。

希望这对您有很大帮助。

【讨论】:

  • 感谢 vaibhav!我一直在使用这个解决方案时遇到问题,可能是因为我无法将这个解决方案从情节提要正确地调整到 ViewControllers。我终于决定使用另一个侧边菜单库并且它现在可以工作了(这个库是 LGSideMenuController)。无论如何都非常感谢!
  • 实际上迁移到另一个解决方案是一个很好的做法,无论如何这是您的选择,感谢您的反馈。
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2020-08-27
  • 2021-05-07
  • 2012-08-24
相关资源
最近更新 更多