【问题标题】:SWRevealViewController Set Front VC Objective-CSWRevealViewController 设置前端 VC Objective-C
【发布时间】:2015-11-25 06:16:45
【问题描述】:

我在我的项目中为侧边菜单项实现了 SWRevealViewController。基本上我的应用程序是一种音乐应用程序。如果用户在其他屏幕或背景中,主屏幕中的歌曲将继续播放。我正在关注本教程 AppCoda (http://www.appcoda.com/ios-programming-sidebar-navigation-menu/)

  1. 当启动主屏幕的应用程序启动时,也会开始播放歌曲。
  2. 如果用户从侧面菜单项转到另一个屏幕,例如播放列表。主屏幕在 Stack 中,歌曲播放完美。 播放列表屏幕位于前面。
  3. 我再次从侧面菜单项进入主屏幕。新实例正在创建,而不是转到已创建的主屏幕。现在,我 可以同时听两首歌。一个来自第一个主屏幕和 另一个来自新主屏幕。

这发生在所有屏幕上。我该如何解决这个问题?我只想要堆栈中的一个屏幕,而不是多次创建同一个屏幕。

这是我的侧边菜单表视图控制器的代码,

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.section == 1) {
        UINavigationController *navController;

        if (indexPath.row == 0) {

            ViewController *homeVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
            navController = [[UINavigationController alloc] initWithRootViewController:homeVC];
            [navController setViewControllers: @[homeVC] animated: YES];

        } else if (indexPath.row == 1) {

            SongsListViewController *songsListVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SongsListViewController"];
            navController = [[UINavigationController alloc] initWithRootViewController:songsListVC];
            [navController setViewControllers: @[songsListVC] animated: YES];

        } else if (indexPath.row == 2) {
            PlayListViewController *songsListVC = [self.storyboard instantiateViewControllerWithIdentifier:@"PlayListViewController"];
            navController = [[UINavigationController alloc] initWithRootViewController:songsListVC];
            [navController setViewControllers: @[songsListVC] animated: YES];
        }

        [self.revealViewController setFrontViewController:navController];
        [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
    }
}

期待您的帮助。提前致谢。

【问题讨论】:

  • 谢谢。我只遵循本教程。实际上,每当我们从 Side Menu TableView 导航到其他屏幕时,都会创建新实例而不是使用前一个。因此,相同的视图控制器在 Stack 中添加了很多次。任何的想法?我无法解决出错的问题。
  • Yuvaraj 请参阅 Meharoof Najeeb 的回答。
  • 对播放器使用单例类,以便始终只有一个播放器。

标签: ios objective-c xcode7 swrevealviewcontroller


【解决方案1】:

实际上你需要将播放处理改为单例,而不是视图控制器

SWSongPlayManagerSingleton.h

#import <Foundation/Foundation.h>

@interface SWSongPlayManagerSingleton : NSObject
+ (instancetype)sharedInstance;
@end

SWSongPlayManagerSingleton.m

@implementation SWSongPlayManagerSingleton 
+ (instancetype)sharedInstance {
   static SWSongPlayManagerSingleton *singleton = nil;
   static dispatch_once_t token;
   dispatch_once(&token, ^{
       singleton = [[self alloc] init];
   });

   return singleton;
}
@end

现在您可以通过以下方式访问 SWSongPlayManagerSingleton 实例 [SWSongPlayManagerSingleton sharedInstance] 总是给你相同的实例。

【讨论】:

  • 谢谢@SeanChense。但是,所有 Viewcontroller 都在发生这种情况。例如,在侧面菜单中,我有 3 个选项(3View 控制器)。第一次在前视图中创建的第一个 Viewcontroller 和歌曲正在播放。转到侧面菜单并单击第二个选项并转到第二个 VC。如果再次要创建第一个 VC 新实例,而不是使用堆栈中的旧实例。所有 VC 都在发生这种情况,例如 2nd 和 3rd。任何的想法?谢谢。
  • 我会试试你的解决方案。谢谢。
  • 实际上你需要将播放处理改为单例,而不是视图控制器。
【解决方案2】:

事实上,在某些情况下您可以听多首歌曲,我认为您的播放器没有在应该的时候正确释放。此外,如果您想播放/控制播放器,无论您在应用程序中的哪个位置,您都应该找到一个全局位置或单例来处理它。也许在侧边菜单表视图控制器中??

我对 SWRevealViewController 不熟悉,但我可以说的是,每次在表格视图中选择菜单时,您都会创建一个新实例。如果您不希望这样,您应该将 homeVC、songsListVC 和 songListVC 作为侧菜单表视图控制器的属性,并且应该进行延迟加载。即)只有当它为零时才创建它们。

【讨论】:

    【解决方案3】:

    实际上,您已经拥有堆栈中的所有视图控制器。您不必像使用“instantiateViewControllerWithIdentifier”方法那样创建新的视图控制器。

    您必须引用导航控制器对象,并且可以使用导航控制器对象的 viewControllers 属性访问堆栈中的视图控制器数组。

    UINavigationController *navController = self.navigationController;
    

    这应该会获得对导航控制器的引用。

    NSArray *viewControllers = navController.viewControllers;
    

    这应该可以让您获得堆栈中已经存在的 viewController。然后,您可以遍历这个 viewControllers 的数组以使用

    检查 HomeViewController 的实例
    for (UIViewController *obj in viewControllers)
    {
        if([obj isKindOfClass:[HomeViewController class]])
        {
            // Your code
        }
    }
    

    【讨论】:

    • 谢谢 Meharoof。希望我需要在 Side Menu TableView 控制器 DidSelectRowAtIndexPath 委托中检查这一点。我在 NavigationController 中嵌入了这个 VC,并试图获取 VC 堆栈。这里我们不是从侧边菜单 VC 推送 VC。因此,堆栈总是显示当前的 VC (SideMenuViewController)。而不是我们将 HomeVC、SongsListVC 和其他 VC 设置为 SWRevealViewController 的 FontView。我还尝试使用 SWRevealVC 的导航控制器堆栈,它返回 nil。正试着。如果您有任何解决方案,请帮助我。谢谢。
    猜你喜欢
    • 2016-07-27
    • 2011-02-06
    • 2011-11-08
    • 2016-04-27
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    相关资源
    最近更新 更多