2015-11-25 2 views
0

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

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

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

Вот мой код из меню Side 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]; 
    } 
} 

Ждем вашей помощи. Заранее спасибо.

+0

обратитесь по этой ссылке http://www.appcoda.com/ios-programming-sidebar-navigation-menu/ –

+0

Спасибо. Я следовал только этому руководству. Фактически всякий раз, когда мы переходим к другому экрану из Side Menu TableView, новый экземпляр создает вместо использования предыдущего. Таким образом, одинаковые контроллеры просмотра добавляют в Stack много раз. Есть идеи? Я не в состоянии оценить проблему, когда я ошибаюсь. –

+0

Yuvaraj, пожалуйста, см. Ответ Meharoof Najeeb. – user3182143

ответ

1

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

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

+0

Спасибо @SeanChense. Но это происходит для всех Viewcontrollers. Например, в боковом меню у меня есть 3 варианта (3View-контроллеры). Первый раз 1-й вид Viewcontroller, созданный в режиме Front View, и воспроизведение песни. Перейдите в боковое меню и выберите вторую опцию и перейдете на второй VC. Если снова я собираюсь в 1-й виртуальный экземпляр нового экземпляра, вместо использования старшего из стека. Это происходит для всех VC, таких как 2-й и 3-й. Есть идеи? Спасибо. –

+0

Я попробую ваше решение. Спасибо. –

+0

На самом деле вам нужно изменить игровое управление на singleton, а не на viewcontroller. – SeanChense

1

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

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

UINavigationController *navController = self.navigationController; 

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

NSArray *viewControllers = navController.viewControllers; 

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

for (UIViewController *obj in viewControllers) 
{ 
    if([obj isKindOfClass:[HomeViewController class]]) 
    { 
     // Your code 
    } 
} 
+0

Спасибо, Мехаруф. Надеюсь, мне нужно проверить это в Side Menu TableView диспетчер DidSelectRowAtIndexPath. Я встроил этот VC в NavigationController и попытался взять стек VC. Здесь мы не нажимаем VC из Side menu VC. Таким образом, стек всегда показывает текущий VC (SideMenuViewController). Вместо этого мы устанавливаем HomeVC, SongsListVC, другие VC как FontView из SWRevealViewController. Также я попытался взять стек навигационного контроллера SWRevealVC, он возвращает нуль. Я пытаюсь. Если у вас есть какие-либо решения, помогите мне. Благодарю. –

+0

Попробуйте настроить объект UINavigationController как self.contentViewController .. – Skywalker

+0

дайте мне знать, если это сработало .. – Skywalker

1

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

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

Смежные вопросы