Start und Stop button in einem

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

  • Start und Stop button in einem

    Hallo zusammen,

    ich versuche eine I-Phone App zu erstellen, die mehrere Sounds abspielen kann. ich habe nach folgendem Youtube Torturial gearbeitet:

    youtube.com/watch?v=uq3l9KRLixU


    Mein Problem ist, dass die verschiedenen Audio-Dateien in meiner App nicht gleichzeitig abgespielt werden können (so wie ich es will).
    Die Buttons sollen den Sound zudem beim ersten Draufklicken abspielen und bei erneutem Draufklicken stoppen (was sie nicht tuhen, beim ersten Klick wird die Audiodatei zwar abgespielt, beim erneutem Klick aber nicht gestoppt, sondern von vorne abgespielt).


    Kann mir ein Crack da weiter helfen;-)? Wäre extrem Dankbar!


    Ein Teil vom Quelltext viewcontroller.m:

    Quellcode

    1. #import "StartstoppViewController.h"
    2. #import
    3. @implementation StartstoppViewController
    4. - (IBAction)pushButton {
    5. NSString *path = [[NSBundle mainBundle] pathForResource:@"1"ofType:@"mp3"];
    6. if (theAudio) [theAudio release];
    7. theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:NULL];
    8. theAudio.delegate = self;
    9. [theAudio play];
    10. }
    11. // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    12. - ([color=#d200a8]void[/color])viewDidLoad {
    13. [color=#000000] [[/color][color=#d200a8]super[/color][color=#000000] [/color]viewDidLoad[color=#000000]];[/color]
    14. }
    15. - ([color=#d200a8]BOOL[/color])shouldAutorotateToInterfaceOrientation:([color=#7e14b1]UIInterfaceOrientation[/color])[color=#7e14b1]interfaceOrientation[/color] {
    16. [color=#000000][/color][color=#d200a8]return[/color][color=#000000] ([/color][color=#7e14b1]interfaceOrientation[/color][color=#000000] == [/color]UIInterfaceOrientationLandscapeLeft[color=#000000]);[/color]
    17. }
    18. - ([color=#d200a8]void[/color])didReceiveMemoryWarning {
    19. [color=#000000][/color]// Releases the view if it doesn't have a superview.
    20. [color=#000000] [[/color][color=#d200a8]super[/color][color=#000000] [/color]didReceiveMemoryWarning[color=#000000]];[/color]
    21. [color=#000000][/color]// Release any cached data, images, etc that aren't in use.
    22. }
    23. - ([color=#d200a8]void[/color])viewDidUnload {
    24. [color=#000000][/color]// Release any retained subviews of the main view.
    25. [color=#000000][/color]// e.g. self.myOutlet = nil;
    26. }
    27. - ([color=#d200a8]IBAction[/color])stop;{
    28. [color=#000000][[/color]theAudio[color=#000000] [/color][color=#480088]stop[/color][color=#000000]];[/color]
    29. }
    30. - ([color=#d200a8]void[/color])dealloc {
    31. [[color=#d200a8]super[/color] [color=#480088]dealloc[/color]];
    32. }
    33. @end
    Alles anzeigen


    Gruß, Flow
  • Dein Problem scheint zu sein, dass Dein Knopfdruck, so wie implementiert, einfach nur abspielt.

    Entweder Du änderst den 'selector' Deines Knopfes, oder Du implementierst eine 'toggle'-Funktionsweise:
    (abstrakt)

    Quellcode

    1. - (IBAction)startStopAudio;{
    2. if(theAudio && theAudio.isPlaying)
    3. {
    4. [theAudio stop];
    5. [theAudio release];
    6. }
    7. else

    Den zweiten Teil hast Du ja schon.

    Dem 'player' solltest Du neben der Instanzvariable auch getter/setter gönnen.
    I would be embarrassed if they did not spy on me.
  • Also ich hab deinen Quellcode jetzt mal eingebracht, denke aber nicht dass das so richtig ist, da nix passiert, was soll ich denn noch weglöschen jetzt??

    Wenn ich die rot markierte Zeile lösche stoppt das Audiofile beim zweiten klick (so wie ich es haben möchte), jedoch stoppt dann alles und nich kann nichts mehr abspielen wenn ich auf den selben oder einen anderen Audio-Button klicke...

    Der Button soll ja starten und stoppen und beim erneuten klicken auch wieder starten.
    die IB-Action kann ich nur pushButton nennen und nicht - (IBAction)startStopAudio; - denke da ich wegen dem Torturial die Actions von ViewController im Interface Builder schon so genannt habe und nicht mehr umbenennen kann.

    -Sorry Leute ich raff nix, sitze aber schon ne Woche an dem Problem und ich muss das von der Arbeit aus machen... und wenn ich das geschafft hab nie mehr;-)

    hier mein neuer Quellcode:

    - (IBAction)pushButton {

    NSString *path = [[NSBundle mainBundle] pathForResource:@"1"ofType:@"mp3"];
    if(theAudio && theAudio.isPlaying)
    {
    [theAudio stop];
    [theAudio release];
    }
    else
    if (theAudio) [theAudio release];
    theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


    }
  • KANNST DU BITTE CODE-TAGS VERWENDEN?

    Dein Fehler ist, dass Du das Attribut zwar frei gibst, es aber nicht wieder auf nil setzt. Du solltest für Audio eine Property (retained) verwenden und statt der release-Aufrufe lieber self.audio = nil; Dann hast Du release & auf nil setzen in einem.
    „Meine Komplikation hatte eine Komplikation.“
  • florian-s07 schrieb:

    -Sorry Leute ich raff nix, sitze aber schon ne Woche an dem Problem und ich muss das von der Arbeit aus machen... und wenn ich das geschafft hab nie mehr;-)
    Eine woche?!

    Code tags verwenden!

    du musst ne property verwenden und auf nil setzten!

    Quellcode

    1. - (IBAction)pushButton {
    2. NSString *path = [[NSBundle mainBundle] pathForResource:@"1"ofType:@"mp3"];
    3. if(theAudio && theAudio.isPlaying) {
    4. [theAudio stop];
    5. self.theAudio = nil;
    6. }
    7. else {
    8. if (theAudio) {
    9. self.theAudio = nil;
    10. }
    11. theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:NULL];
    12. theAudio.delegate = self;
    13. [theAudio play];
    14. }
    15. }
    Alles anzeigen


    EDIT: zu langsam : P
    -Carpe Diem-
  • Hier nur mal das Play/Stop.
    Ich würde es auf jeden fall so machen.

    Quellcode

    1. sound.isPlaying ? [sound stop] : [sound play];


    Wozu den Sound jedes mal neu laden?
    Er wird doch immer wieder gebraucht, oder muss das aufm handy wegen des super-wenig ram's so?
  • florian-s07 schrieb:

    Also ich habe den Quellcode mal so eingegeben und bekomme jetzt folgende 2 Fehler hinter den Zeilen:

    self.theAudio = nil; ->Fehler: "Object cannot be set - eather readonly property or no setter found"


    Was hat das zu bedeuten, bzw. was muss ich jetzt machen? :?:









    Vor Allem 2 Dinge:
    1. Code-Tags endlich verwenden
    2. Fehlermeldung lesen, da steht es genau drin
  • florian-s07 schrieb:

    Also ich habe den Quellcode mal so eingegeben und bekomme jetzt folgende 2 Fehler hinter den Zeilen:

    self.theAudio = nil; ->Fehler: "Object cannot be set - eather readonly property or no setter found"


    Was hat das zu bedeuten, bzw. was muss ich jetzt machen? :?:



    a) Solltest Du Dich ernsthaft um 'properties' kümmern.
    b) Solltest Du beim Abtippen von Code immer auch nechdenken. So doll ist das Beispiel, das 'KaboomProjeXs' aus meinem, mit Absicht als "abstrakt" bezeichnetem Beispiel gezimmert hat, nicht.
    I would be embarrassed if they did not spy on me.