2012-01-05 25 views
8

Tôi đang sử dụng UIBarButtonSystemItemPlay để phát tệp âm thanh của mình và tôi muốn thay đổi kiểu động đó khi tôi bấm vào nó. Có thể không ?, nếu có, hãy giúp tôi. Đây là mã của tôi, trong đó _playPause là IBOutlet của UIBarButtonSystemItemPlay. Cảm ơn trước.Làm thế nào tôi có thể thay đổi kiểu UIBarButtonItem trong mã

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

Bạn đã thử với '==' thay vì '='? ... dù sao tôi sẽ sử dụng cờ bool ivar để kiểm tra xem âm thanh có đang phát hay không. – Mat

+0

oh xin lỗi! cảm ơn rất nhiều, tôi sẽ kiểm tra nó và đến với bạn sau. –

+0

Tôi đã kiểm tra nó, nhưng nó không hoạt động.Không thể truy xuất –

Trả lời

0

Tôi tin rằng một khi phong cách được thiết lập ban đầu (ví dụ: trong xây dựng giao diện hoặc khi bạn tạo các nút trong mã), bạn không thể thay đổi nó.

Tùy chọn duy nhất khác của bạn là xóa nút trong mã và tạo một nút mới ở vị trí của nó bằng cách sử dụng một kiểu khác. Bạn có thể gọi phương pháp này:

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

Để biết thêm về các UIBarButtonItem hãy nhìn vào this.

5

UIBarButtonSystemItemPlay hoặc UIBarButtonSystemItemPause không thể truy xuất được theo thuộc tính kiểu. kiểu là loại UIBarButtonItemStyle.

Kiểm tra tài liệu here.

Tôi đề nghị tạo hai khác nhau UIBarButtonItem và sau đó bật hoặc tắt (ví dụ) chúng luân phiên nhau. Bạn cũng có thể xóa nút hiển thị hiện tại và thêm nút mới với UIBarButtonSystemItem khác.

2

Dưới đây là một giải pháp khá hoàn chỉnh cho này mà tôi chỉ thực hiện:

Thứ nhất, xác định vars để giữ cả hai nút:

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

(hiểu biết của tôi ở đây là thanh công cụ là một ref yếu vì nó đang được xác định thông qua IB và nó có một con trỏ mạnh mẽ với nó, nhưng các nút play/pause là những con trỏ mạnh bởi vì chúng ta đang tạo chúng bên dưới.Nhưng fu của tôi là một chút yếu trên mặt trận này như một newbie khá, do đó sửa chữa được đánh giá cao.)

Thứ hai, tôi n IB chỉ tạo một nút phát (không có nút tạm dừng) và buộc nó vào nút playButton ở trên.

Thứ ba, thiết lập phương pháp này:

- (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]; 
    } 
} 

Thứ tư, gọi setAsPlaying bất cứ nơi nào bạn đang đi chơi hay chế độ tạm dừng. Ví dụ:

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

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

Ngoài ra, bạn không cần phải sử dụng các thuộc tính 'mạnh', vì bạn đang tái instanciating' UIBarButtonItem'. bạn có thể sử dụng biến 'UIBarButtonItem' cục bộ trong phương thức của bạn và các thuộc tính' weak'. – Vinzzz

+0

bạn có thể lấy chỉ mục động của nút để loại bỏ, bằng cách thực hiện 'NSInteger index = [toolbarButtons indexOfObject: buttonToRemove]' và sau đó '[toobarButtons replaceObjectAtIndex: index withObject: buttonToAdd]' – Vinzzz

+0

@Vinzzz: bổ sung tốt đẹp, cảm ơn! – mowliv

0

Có, bạn không thể thay đổi "kiểu" (nó không thực sự được gọi là kiểu) sau khi được đặt.

Có, bạn có thể thực hiện một nút khác để sửa lỗi.

Đây là mã tái sử dụng nào đó:

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

Ở đây, điều khiển thường self là.

Các vấn đề liên quan