SWRevealViewController Установить передний VC Objective-C

Я реализовал SWRevealViewController в своем проекте для элемента бокового меню. По сути, это музыкальное приложение. Песни с главного экрана будут воспроизводиться непрерывно, если пользователь находится на другом экране или в фоновом режиме. Следую этому руководству AppCoda (http://www.appcoda.com/ios-programming-sidebar-navigation-menu/)

  1. Когда приложение запускает главный экран, также запускается воспроизведение песни.
  2. Если пользователь переходит на другой экран, например плейлист, из пункта бокового меню. Главный экран находится в стеке, и песня воспроизводится отлично. Экран списков воспроизведения находится спереди.
  3. Снова захожу на главный экран из пункта бокового меню. Новый экземпляр создается вместо перехода на уже созданный главный экран. Теперь я могу слушать две песни одновременно. Один с первого главного экрана, а другой с нового главного экрана.

Это происходит для всех экранов. Как я могу решить эту проблему? Мне нужен только один экран из стека, а не много раз создавать один и тот же экран.

Вот мой код из бокового меню tableview Controller,

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

С нетерпением жду вашей помощи. Заранее спасибо.


person Yuvaraj.M    schedule 25.11.2015    source источник


Ответы (3)


На самом деле вам нужно изменить обработку воспроизведения на синглтон, а не на контроллер представления.

in SWSongPlayManagerSingleton.h

#import <Foundation/Foundation.h>

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

in 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], который всегда дает вам один и тот же экземпляр.

person SeanChense    schedule 25.11.2015
comment
Спасибо @SeanChense. Но это происходит для всех Viewcontrollers. Например, в боковом меню у меня есть 3 варианта (контроллеры 3View). Впервые 1st Viewcontroller создан в режиме Front View и воспроизводится песня. Переходим в боковое меню и нажимаем 2-й вариант и переходим ко 2-му VC. Если снова иду в 1-й ВК, создается новый экземпляр вместо использования старого из стека. Это происходит для всех венчурных капиталистов, таких как 2-й и 3-й. Есть идеи? Спасибо. - person Yuvaraj.M; 25.11.2015
comment
Я попробую ваше решение. Спасибо. - person Yuvaraj.M; 25.11.2015
comment
На самом деле вам нужно изменить обработку воспроизведения на синглтон, а не на контроллер представления. - person SeanChense; 25.11.2015

Тот факт, что в некоторых случаях вы можете слушать несколько песен, я думаю, что ваш плеер не освобождается должным образом, когда это предполагается. Кроме того, если вы хотите играть/управлять плеером независимо от того, где вы находитесь в приложении, вы должны найти глобальное место или синглтон для этого. Может быть, в контроллере представления таблицы бокового меню ??

Я не знаком с SWRevealViewController, но могу сказать, что вы создаете новый экземпляр каждый раз, когда выбираете меню в табличном представлении. Если вы этого не хотите, вы должны иметь homeVC, songListVC и songListVC в качестве свойств контроллера представления таблицы бокового меню и выполнять ленивую загрузку. i.e) Вы создаете их только в том случае, если они равны нулю.

person HMHero    schedule 25.11.2015

На самом деле у вас уже есть все контроллеры представления в стеке. Вам не нужно создавать новые контроллеры представления, как вы делаете с методом «instantiateViewControllerWithIdentifier».

Вы должны сослаться на объект контроллера навигации, и вы можете получить доступ к массиву контроллеров представления в стеке с помощью свойства viewControllers объекта контроллера навигации.

UINavigationController *navController = self.navigationController;

Это должно получить ссылку на ваш навигационный контроллер.

NSArray *viewControllers = navController.viewControllers;

Это должно дать вам viewControllers, уже присутствующие в стеке. Затем вы можете пройтись по этому массиву viewControllers, чтобы проверить экземпляр вашего HomeViewController, используя

for (UIViewController *obj in viewControllers)
{
    if([obj isKindOfClass:[HomeViewController class]])
    {
        // Your code
    }
}
person Skywalker    schedule 25.11.2015
comment
Спасибо, Мехаруф. Надеюсь, мне нужно проверить это в делегате DidSelectRowAtIndexPath контроллера TableView бокового меню. Я встроил этот VC в NavigationController и попытался взять стек VC. Здесь мы не выдвигаем ВК из бокового меню ВК. Таким образом, стек всегда показывает текущий VC (SideMenuViewController). Вместо этого мы устанавливаем HomeVC, SongsListVC и другие VC как FontView для SWRevealViewController. Также я попытался взять стек навигационного контроллера SWRevealVC, он возвращает ноль. Я пытаюсь. Если у вас есть какое-либо решение, пожалуйста, помогите мне. Спасибо. - person Yuvaraj.M; 25.11.2015