Musikplayer eines TableViewCells stoppen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Musikplayer eines TableViewCells stoppen

    Halle zusammen,

    ich hab hier ein Problem das sich nicht ohne weiteres lösen lässt.

    Ich hab hier ein Musicplayer (keins von Hause Apple/Swift) das in Objective-C geschrieben worden ist.
    Der Player ist in einem TableViewCell implementiert und ich habe das Problem, dass wenn der Player einen Titel abspielt, diesen auch dann weiter hin abspielt, wenn ich die TableView verlassen habe und das möchte ich nicht.

    Ich hab es mit "MPMusicPlayerController" und "AVAudioSession" probiert aber auch damit die TableView vom memory zu laden über die viewDidDisappear/viewWillDisappear, erfolglos oder falsch.

    Gleich am Anfang lese ich was von einem Observer, vermutlich soll das mein Problem eigentlich lösen, was es aber nicht tut.

    Jemand ein Tipp wie ich da ran gehen könnte?


    - Swiffer

    Python-Quellcode

    1. #import "XMMContentBlock1TableViewCell.h"
    2. @interface XMMContentBlock1TableViewCell () <XMMMediaFileDelegate>
    3. @property (nonatomic, strong) UIImage *playImage;
    4. @property (nonatomic, strong) UIImage *pauseImage;
    5. @property (nonatomic, strong) XMMMediaFile *mediaFile;
    6. @end
    7. @implementation XMMContentBlock1TableViewCell
    8. - (void)awakeFromNib {
    9. [[NSNotificationCenter defaultCenter] addObserver:self
    10. selector:@selector(pauseAllXMMMusicPlayer)
    11. name:@"pauseAllSounds"
    12. object:nil];
    13. [self setupImages];
    14. self.fileManager = [[XMMOfflineFileManager alloc] init];
    15. [self.audioControlButton setImage:self.playImage
    16. forState:UIControlStateNormal];
    17. self.audioControlButton.tintColor = UIColor.blackColor;
    18. [self.forwardButton setImage:[self.forwardButton.currentImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]
    19. forState:UIControlStateNormal];
    20. self.forwardButton.tintColor = UIColor.blackColor;
    21. [self.backwardButton setImage:[self.backwardButton.currentImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]
    22. forState:UIControlStateNormal];
    23. self.backwardButton.tintColor = UIColor.blackColor;
    24. [super awakeFromNib];
    25. }
    26. - (void)prepareForReuse {
    27. [super prepareForReuse];
    28. _progressBar.lineProgress = 0.0f;
    29. _mediaFile.delegate = nil;
    30. [_movingBarView stop];
    31. [_audioControlButton setImage:self.playImage forState:UIControlStateNormal];
    32. }
    33. - (void)setupImages {
    34. NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    35. NSURL *url = [bundle URLForResource:@"XamoomSDK" withExtension:@"bundle"];
    36. NSBundle *imageBundle = nil;
    37. if (url) {
    38. imageBundle = [NSBundle bundleWithURL:url];
    39. } else {
    40. imageBundle = bundle;
    41. }
    42. self.playImage = [[UIImage imageNamed:@"playbutton"
    43. inBundle:imageBundle
    44. compatibleWithTraitCollection:nil] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    45. self.pauseImage = [[UIImage imageNamed:@"pausebutton"
    46. inBundle:imageBundle
    47. compatibleWithTraitCollection:nil] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    48. }
    49. - (void)configureForCell:(XMMContentBlock *)block tableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath style:(XMMStyle *)style offline:(BOOL)offline {
    50. self.titleLabel.text = block.title;
    51. // Ändert die Schriftart des Musiktitels
    52. self.titleLabel.font = [UIFont fontWithName:@"Avenir Next" size: 17];
    53. self.artistLabel.text = block.artists;
    54. // Färbe den Mediaplayer ein.
    55. self.forwardButton.tintColor = [UIColor colorWithHexString:@"#FFFFFF"];
    56. self.backwardButton.tintColor = [UIColor colorWithHexString:@"#FFFFFF"];
    57. // self.movingBarView.tintColor = color;
    58. self.audioControlButton.tintColor = [UIColor colorWithHexString:@"#FFFFFF"];
    59. if (block.fileID == nil) {
    60. return;
    61. }
    62. NSURL *url;
    63. if (offline) {
    64. url = [self.fileManager urlForSavedData:block.fileID];
    65. } else {
    66. url = [[NSURL alloc] initWithString:block.fileID];
    67. }
    68. _mediaFile = [[XMMAudioManager sharedInstance] createMediaFileForPosition:block.ID
    69. url:url
    70. title:block.title
    71. artist:block.artists];
    72. _mediaFile.delegate = self;
    73. [self didUpdatePlaybackPosition:_mediaFile.playbackPosition];
    74. if (_mediaFile.isPlaying) {
    75. [self didStart];
    76. }
    77. }
    78. - (void)didStart {
    79. NSLog(@"didStart");
    80. self.playing = YES;
    81. [self.movingBarView start];
    82. [self.audioControlButton setImage:self.pauseImage forState:UIControlStateNormal];
    83. }
    84. - (void)didPause {
    85. NSLog(@"didPause");
    86. self.playing = NO;
    87. [self.movingBarView stop];
    88. [self.audioControlButton setImage:self.playImage forState:UIControlStateNormal];
    89. }
    90. - (void)didStop {
    91. NSLog(@"didStop");
    92. self.playing = NO;
    93. [self.movingBarView stop];
    94. [self.audioControlButton setImage:self.playImage forState:UIControlStateNormal];
    95. }
    96. // RemainingTime Fix
    97. - (void)didUpdatePlaybackPosition:(long)playbackPosition {
    98. float progress = (float)playbackPosition/(float)self.mediaFile.duration;
    99. self.progressBar.lineProgress = progress;
    100. float absTimeOfMusik = (float)self.mediaFile.duration;
    101. float songDurationInSeconds = self.mediaFile.playbackPosition;
    102. float remainingTime = absTimeOfMusik - songDurationInSeconds;
    103. self.countingTimeLabel.text = [NSString stringWithFormat:@"%d:%02d", (int)songDurationInSeconds / 60, (int)songDurationInSeconds % 60];
    104. self.remainingTimeLabel.text = [NSString stringWithFormat:@"-%d:%02d", (int)remainingTime / 60, (int)remainingTime % 60];
    105. }
    106. - (IBAction)playButtonTouched:(id)sender {
    107. if (!self.isPlaying) {
    108. self.playing = YES;
    109. [self.audioControlButton setImage:self.pauseImage forState:UIControlStateNormal];
    110. [_mediaFile start];
    111. } else {
    112. self.playing = NO;
    113. [self.audioControlButton setImage:self.playImage forState:UIControlStateNormal];
    114. [_mediaFile pause];
    115. }
    116. }
    117. // Musikvorspulen auf 15 Sekunden gesetzt
    118. - (IBAction)forwardButtonTouched:(id)sender {
    119. [_mediaFile seekForward:15];
    120. }
    121. - (IBAction)backwardButtonTouched:(id)sender {
    122. [_mediaFile seekBackward:15];
    123. }
    124. #pragma mark - XMMMMusicPlayer delegate
    125. - (void)finishedPlayback {
    126. self.playing = NO;
    127. [self.movingBarView stop];
    128. [self.audioControlButton setImage:self.playImage
    129. forState:UIControlStateNormal];
    130. }
    131. - (void)changeTextColors:(UIColor *)color {
    132. self.titleLabel.textColor = color;
    133. self.artistLabel.textColor = color;
    134. self.remainingTimeLabel.textColor = color;
    135. self.forwardLabel.textColor = color;
    136. self.backwardLabel.textColor = color;
    137. self.forwardButton.tintColor = color;
    138. self.backwardButton.tintColor = color;
    139. self.movingBarView.tintColor = color;
    140. self.audioControlButton.tintColor = color;
    141. }
    142. #pragma mark - Appearance Getters & Setters
    143. - (void)setAudioPlayerBackgroundColor:(UIColor *)audioPlayerBackgroundColor {
    144. _audioPlayerView.backgroundColor = audioPlayerBackgroundColor;
    145. }
    146. - (UIColor *)audioPlayerBackgroundColor {
    147. return _audioPlayerView.backgroundColor;
    148. }
    149. - (void)setAudioPlayerProgressBarBackgroundColor:(UIColor *)audioPlayerProgressBarBackgroundColor {
    150. _progressBar.backgroundLineColor = audioPlayerProgressBarBackgroundColor;
    151. }
    152. - (UIColor *)audioPlayerProgressBarBackgroundColor {
    153. return _progressBar.backgroundLineColor;
    154. }
    155. - (void)setAudioPlayerProgressBarColor:(UIColor *)audioPlayerProgressBarColor {
    156. _progressBar.foregroundLineColor = audioPlayerProgressBarColor;
    157. }
    158. - (UIColor *)audioPlayerProgressBarColor {
    159. return _progressBar.foregroundLineColor;
    160. }
    161. - (void)setAudioPlayerTintColor:(UIColor *)audioPlayerTextColors {
    162. [self changeTextColors:audioPlayerTextColors];
    163. }
    164. - (UIColor *)audioPlayerTintColor {
    165. return _titleLabel.textColor;
    166. }
    167. #pragma mark - Notification Handler
    168. - (void)pauseAllXMMMusicPlayer {
    169. [self.movingBarView stop];
    170. self.playing = NO;
    171. }
    172. @end
    Alles anzeigen
  • Ich hab versucht, damit das Problem zu lösen, leider keine Reaktion darauf... falls noch etwas einfallen sollte bin ich sehr dankbar! Wobei das mit dem NSNotification oder Notification wohl die Lösung sein müsste.


    Python-Quellcode

    1. NotificationCenter.default.post(name: Notification.Name("pauseAllSounds"), object: nil)
    2. NotificationCenter.default.post(name: NSNotification.Name(rawValue: "pauseAllSounds"), object: nil)
    Außerdem die TableView ist in einem NavigationController eingebettet, das müsste doch ohnehin durch das verlassen vom memory weg geladen werden, wenn ich mich nicht irre?
  • Setze mal einen Breakpoint in der Methode pauseAllXMMMusicPlayer in XMMContentBlock1TableViewCell.

    Damit kannst Du dann schon mal prüfen, ob die Notification entsprechend empfangen wird.

    In der Methode pauseAllXMMMusicPlayer hätte ich allerdings auch ein

    Quellcode

    1. [_mediaFile pause];
    erwartet. Mir ist da nicht ganz klar, wie die Wiedergabe sonst angehalten wird. ?(
  • Ich hab den Breakpoint dort gesetzt und die Methode wird sogar ganz ohne NSNotification aufgerufen, zusätzlich hab ich noch die "didStop" Methode mit eingebaut, sie wird auch laut Terminal ausgeführt, beendet dies jedoch nicht.


    Python-Quellcode

    1. - (void)pauseAllXMMMusicPlayer {
    2. [self.movingBarView stop];
    3. self.playing = NO;
    4. self.didStop;
    5. }
    Gibt es die Möglichkeit ein Prozess zu killen in Swift?
  • MCDan schrieb:

    Hm, sollte eigentlich funktionieren, da es in der Beispiel App auch so gemacht wird.

    C-Quellcode

    1. - (void)viewWillDisappear {
    2. [[NSNotificationCenter defaultCenter] postNotificationName:@"pauseAllSounds" object:self];
    3. ...
    4. }
    Im Unterschied dazu sendet der Fragende als object-Parameter nil. Vielleicht ist das das Problem?
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • Swiffer schrieb:

    Ich hab den Breakpoint dort gesetzt und die Methode wird sogar ganz ohne NSNotification aufgerufen, zusätzlich hab ich noch die "didStop" Methode mit eingebaut, sie wird auch laut Terminal ausgeführt, beendet dies jedoch nicht.


    Python-Quellcode

    1. - (void)pauseAllXMMMusicPlayer {
    2. [self.movingBarView stop];
    3. self.playing = NO;
    4. self.didStop;
    5. }
    Gibt es die Möglichkeit ein Prozess zu killen in Swift?
    Die Methode didStop beendet bzw. pausiert ja auch nicht das Abspielen des XMMMediaFile. Dazu solltest Du lieber

    Quellcode

    1. [_mediaFile pause];
    verwenden.

    Die Frage bleibt jedoch, was sich der Entwickler dabei gedacht hat diesen Aufruf zu "vergessen". Mir ist nicht ganz klar, wie das Abspielen des XMMMediaFile ohne pause Aufruf beendet werden soll. ?(
  • Ach "[_mediaFile pause];" soll eine Funktion gewesen sein? Sorry das hab ich erst jetzt geblickt. Obj-C ist noch sehr neu für mich, hab Erbamen. Das hat mein Problem aus schon gelöst! Du bist mein Held MCDan!!


    EDIT:

    Um deswegen nicht ein neues Thema zu eröffnen, da er hier zu passt, schreibe ich mein Anliegen hier drunter.


    Wie wäre es möglich diesen Player auch außerhalb zu steuern?

    Ich habe vor in der App eine Warnmeldung bzw. eine View vor zu schieben und den Ton oder den Player zu stoppen, so bald der User den Playbutton betätigt UND keine Kopfhörer angeschlossen hat.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Swiffer ()