2014-02-13 4 views
0

Я собираюсь создать это приложение, где пользователи смогут прослушивать треки, заполненные в uiTableView. Когда пользователь нажимает на строку, он должен уведомить другой класс (мой аудиоплеер) об этом действии и ect. загрузить mp3-url.Лучший способ информировать класс A о классе B в iOS

Illustration of my storyboard architecture, the top line illustrates the two view controllers that needs to communiate

Причина, почему я выбираю иметь контроллер представления в передней части навигационного контроллера просто. Мне нужно постоянное представление (мой аудиоплеер, отмеченный темно-серым цветом), который будет отображаться на всех контроллерах представлений, и я нашел это решение самым легким. Моя проблема здесь в том, как рассказать классу звукового проигрывателя о действиях, происходящих в trackTableView. Я знаю, что вы можете использовать делегирование, но не знаете, как это делается правильно, когда между ними есть навигационный контроллер.

Еще одна вещь, о которой я подумал, - это использование звукового проигрывателя в качестве одноэлементного (это будет так или иначе, поскольку мне нужен только один экземпляр аудиоплеера), а затем просто вызовите метод singleton, когда мне нужно Это.

Каков наилучший способ справиться с этим, однотонные методы или делегирование? И как делаются делегации в такой ситуации?

ответ

2

Обычно делегирование является хорошим примером для этого, поскольку это «самый чистый» способ. Все интерфейсы имеют дизайн и т. Д.

Проблема в этом случае будет заключаться в том, что при запуске делегата tableview вам необходимо установить (ваш) делегат аудиоплеера. Поэтому вам понадобится ссылка на аудиоплеер где-то еще в вашем коде. По этой причине я бы предложил использовать одноэлемент.

Последний шаблон, о котором я хотел бы поговорить, будет использовать оповещения (NSNotificationCenter + NSNotification). Обычно вы не просто хотите управлять своим аудиоплеером, когда пользователь выбирает новый заголовок и т. Д., Но также имеют другие вещи, такие как обновление плейлиста, просмотр обновления, отображающий, что происходит и т. Д.

Если все это все в разных частях вашего кода (и не контролируется напрямую вашим аудиоплеером), уведомления также будут очень полезными!

Для лучшей практики я бы предложил: Контролируйте весь свой код для отображения и управления плейлистом из центрального синглтона. Если это не то, что вы сделали, используйте уведомления!

Если вы не знаете, как работает NSNotificationCenter, вот короткий пример кода:

[[NSNotificationCenter defaultCenter] postNotificationName:@"START_MUSIC" object:nil userInfo:nil]; 

Это разместит уведомление всех слушателей ждут уведомлений под названием @"START_MUSIC". Если вам нужно предоставить дополнительные данные, например, какую песню выбрать и т. Д., Вы можете создать NSDictionary и добавить его в userInfo -параметр (в этом случае я оставил его в нуле)

Затем в другом классе, где вы хотите получить это уведомление, вы звоните

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startMusic:) name:@"START_MUSIC" object:nil]; 

И вы должны реализовать

- (void)startMusic:(NSNotification *)notification 
{ 
    // if you provided some extra information, this is where you get your dictionary! 
    NSDictionary* userInfo = notification.userInfo; 
} 

вы также должны прекратить прослушивание уведомлений, когда этот объект быть высвобождены!Поэтому добавьте в ваш -(void)dealloc метод:

- (void)dealloc 
{ 
    // rest of your dealloc code! 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    // if not using ARC: 
    // [super dealloc] 
} 

В общем, если вы хотите, чтобы остановить прослушивание уведомлений вы можете использовать -(void)removeObserver:(id)observer методы центра уведомлений или другой более подробных один раз (например, прекратить прослушивание для конкретного уведомления). Если вы просто вызываете этот общий метод, вы перестаете прослушивать все уведомления с этим объектом.

+0

Отлично подходит для такого простого примера. Я думаю, я поеду с шаблоном singleton и попробую центр уведомлений для тестирования. Благодаря! :) – user3185856

+0

без проблем мат. если вы столкнетесь с любыми препятствиями, дайте мне знать –

+0

Эй, я забыл упомянуть, вы должны удалить текущий объект в качестве наблюдателя в методе dealloc вашего объекта! –

0

вы можете обрабатывать воспроизведение, используя общий экземпляр (просто назовите его sharedPlayer), обработайте PlayingViewController как обычный экземпляр VC. когда пользователь нажимает на ячейку tableview, чтобы выбрать дорожку, выделите и нажмите PlayingViewController с помощью selectedTrack. затем вызовите sharedPlayer в контроллере представления.

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

  • Нет связанных вопросов^_^