Первая часть проста.Вместо того, чтобы создавать новый NowPlayingViewController каждый раз, когда вы хотите перенести его в стек навигации, просто повторно используйте существующий.Затем вам нужно будет передать звуковую ссылку через свойство в NowPlayingViewController.
@interface MyTableViewController {
NowPlayingViewController *nowPlayingViewController;
}
@implementation MyTableViewController{
...
nowPlayingViewController = [[nowPlayingViewController alloc]init];
...
[nowPlayingViewController setAudio:@"urlToAudio"]
this.navigationController.pushViewController(nowPlayingViewController);
...
}
Редактировать: вышеупомянутое было уместно, только если вы создавали экземпляр viewController, как это и предполагалось.Оказывается, вы использовали раскадровку, которая автоматически создает новые экземпляры viewsControllers в сегментах.Поэтому проблема в том, что вы не останавливаете музыку (см. Ниже).
Что касается 2-й части (музыка не останавливается), вы, кажется, нигде не останавливаете музыку.Сделайте это в вызове делегата «viewDidUnload» или «viewWillDisappear», который вызывается, когда представление больше не используется.
Новое редактирование на основе новых требований:
- вы хотите, чтобы представление Now Playing управляло музыкой.
- вы не хотите, чтобы музыка останавливалась, даже если представление Now Playing выгружено.
В этом случаеВы должны отделить AudioPlayer от представления Now Playing.
Вы должны передавать AudioPlayer извне, каждый раз, когда создается представление NowPlaying.Оптимально, чтобы у вас был класс, который поддерживает состояние приложения музыкального проигрывателя.
@interface MusicPlayer : NSObject{
}
// example
-(bool) isPlaying;
-(bool) isPaused;
-(void) play;
-(void) pause;
-(void) stop;
-(void) changeTrack;
-(NSString *)currentTrack;
//etc.
@end
Затем, когда вы делаете переход, вместо того, чтобы просто сообщать представлению NowPlaying, какую дорожку воспроизводить, передайте ее MusicPlayer.вместо этого.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Make sure your segue name in storyboard is the same as this line
if ([[segue identifier] isEqualToString:@"Audio Selection Segue"])
{
// Get reference to the destination view controller
NowPlayingViewController *np = [segue destinationViewController];
//Pass the selected audio title to the Now Playing View
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:self.tableView.indexPathForSelectedRow];
[self.player stop];
[self.player changeTrack:@"urlToTrack"];
[self.player play];
np.player = self.player;
}
}
Теперь вместо кнопок, управляющих тем, что воспроизводить и т. д., пусть ваши кнопки просто отправляют сообщения на ваш музыкальный проигрыватель.С помощью NSNotification вы даже можете позволить музыкальному проигрывателю отправлять события на ваши представления для обновления таких вещей, как название альбома, название дорожки, обложка альбома и т. Д.