2012-01-05 15 views
8

Używam UIBarButtonSystemItemPlay do odtwarzania mojego pliku audio i chcę zmienić jego styl dynamicznie, kiedy go kliknę. Czy to możliwe ?, jeśli tak, to proszę, pomóżcie mi. To jest mój kod, gdzie _playPause to IBOutlet z UIBarButtonSystemItemPlay. Z góry dziękuję.Jak mogę zmienić styl UIBarButtonItem w kodzie

- (IBAction)playPause:(UIBarButtonItem *) sender 
{ 
    if (_playPause.style == UIBarButtonSystemItemPlay) 
    { 
     [_playPause setStyle:UIBarButtonSystemItemPause]; 
     [audio play]; 
    } 
    else 
    { 
     [_playPause setStyle:UIBarButtonSystemItemPlay]; 
     [audio pause]; 
    } 
} 
+1

Czy próbowałeś z '==' zamiast '='? ... w każdym razie użyłbym flagi ivar bool, aby sprawdzić, czy dźwięk jest odtwarzany, czy nie. – Mat

+0

oh przepraszam! wielkie dzięki, sprawdzę to i przyjdę do ciebie później. –

+0

Sprawdziłem, ale to nie działa. –

Odpowiedz

0

wierzę, że gdy styl jest wstępnie ustawiony (czyli w interfejsie konstruktora lub podczas tworzenia przycisku w kodzie) nie można go zmienić.

Twoją jedyną opcją jest usunięcie przycisku w kodzie i utworzenie nowego na swoim miejscu przy użyciu innego stylu. Można wywołać tę metodę:

- (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action 

Aby uzyskać więcej informacji na UIBarButtonItem przyjrzeć this.

5

UIBarButtonSystemItemPlay lub UIBarButtonSystemItemPause nie można pobrać według właściwości stylu. styl jest typu UIBarButtonItemStyle.

Sprawdź dokumentację here.

Proponuję utworzyć dwa różne UIBarButtonItem, a następnie włączyć lub wyłączyć (na przykład) je na przemian. Możliwe jest również usunięcie bieżącego widocznego przycisku i dodanie nowego z innym UIBarButtonSystemItem.

2

Oto bardzo kompletne rozwiązanie do tego, że po prostu realizowane:

Najpierw zdefiniuj vars trzymać oba przyciski:

@property (weak, nonatomic) IBOutlet UIToolbar *toolbar; 
@property (strong, nonatomic) IBOutlet UIBarButtonItem *playButton; 
@property (strong, nonatomic) IBOutlet UIBarButtonItem *pauseButton; 

(moim rozumieniu jest to, że pasek narzędzi jest słabym ref ponieważ jest określany przez IB i ma silny wskaźnik do niego, ale przyciski play/pause są mocnymi wskazówkami, ponieważ tworzymy je poniżej, ale moje fu jest trochę słabe na tym froncie jako dość początkujący, więc poprawki są doceniane.)

Po drugie, mogę n IB utwórz tylko przycisk odtwarzania (bez przycisku pauzy) i powiązaj go z powyższym var playButton.

trzecie, skonfigurować tę metodę:

- (void) setAsPlaying:(BOOL)isPlaying 
{ 
    self.rootViewController.playing = isPlaying; 

    // we need to change which of play/pause buttons are showing, if the one to 
    // reverse current action isn't showing 
    if ((isPlaying && !self.pauseButton) || (!isPlaying && !self.playButton)) 
    { 
     UIBarButtonItem *buttonToRemove = nil; 
     UIBarButtonItem *buttonToAdd = nil; 
     if (isPlaying) 
     { 
      buttonToRemove = self.playButton; 
      self.playButton = nil; 
      self.pauseButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPause 
                      target:self 
                      action:@selector(pauseAudio:)]; 
      buttonToAdd = self.pauseButton; 
     } 
     else 
     { 
      buttonToRemove = self.pauseButton; 
      self.pauseButton = nil; 
      self.playButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay 
                      target:self 
                      action:@selector(playAudio:)]; 
      buttonToAdd = self.playButton; 
     } 

     // Get the reference to the current toolbar buttons 
     NSMutableArray *toolbarButtons = [[self.toolbar items] mutableCopy]; 

     // Remove a button from the toolbar and add the other one 
     if (buttonToRemove) 
      [toolbarButtons removeObject:buttonToRemove]; 
     if (![toolbarButtons containsObject:buttonToAdd]) 
      [toolbarButtons insertObject:buttonToAdd atIndex:2]; // vary this index to put in diff spots in toolbar 

     [self.toolbar setItems:toolbarButtons]; 
    } 
} 

czwarte, zadzwoń setAsPlaying gdziekolwiek rozegrają lub w trybie wstrzymania. Na przykład:

-(IBAction) playAudio:(id)sender 
{ 
    [self.audioPlayer play]; 
    [self setAsPlaying:YES]; 
} 

-(IBAction) pauseAudio:(id)sender 
{ 
    [self.audioPlayer pause]; 
    [self setAsPlaying:NO]; 
} 
+0

Nie musisz też używać właściwości 'strong', ponieważ i tak przesyłasz' UIBarButtonItem'. możesz użyć lokalnej zmiennej 'UIBarButtonItem' w twojej metodzie i' słabych' właściwości. – Vinzzz

+0

można pobrać dynamicznie indeks przycisku do usunięcia, wykonując 'NSInteger index = [toolbarButtons indexOfObject: buttonToRemove]', a następnie '[toobarButtons replaceObjectAtIndex: index withObject: buttonToAdd]' – Vinzzz

+0

@ Vinzzz: miłe dodatki, dzięki! – mowliv

0

Tak, nie można zmienić "stylu" (tak naprawdę nie jest to tak zwany styl) po jego ustawieniu.

Tak, możesz zrobić kolejny przycisk, który go naprawi.

Oto kod wielokrotnego użytku, które to robi:

UIBarButtonItem *newButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
    target:controller.navigationItem.rightBarButtonItem.target 
    action:controller.navigationItem.rightBarButtonItem.action]; 
controller.navigationItem.rightBarButtonItem = newButton; 

Tutaj kontroler jest zwykle self.

Powiązane problemy