2012-01-05 39 views
8

我正在使用UIBarButtonSystemItemPlay播放我的音频文件,并且当我单击它时,我想要动态更改它的样式。是否有可能?如果是的话,请帮助我。这是我的代码,其中_playPause是UIBarButtonSystemItemPlay的IBOutlet。提前致谢。我如何更改代码中的UIBarButtonItem的样式

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

你用'=='而不是'='来试试吗?......无论如何我会用一个ivar布尔标志来检查音频是否播放。 – Mat 2012-01-05 09:00:10

+0

哦对不起!非常感谢,我会检查它,稍后再来找你。 – 2012-01-05 10:11:30

+0

我检查过它,但它不起作用。 – 2012-01-05 10:53:01

回答

0

我相信,一旦最初设置风格(即在界面构建器中或者在代码中创建按钮时),您无法更改它。

您唯一的选择是删除代码中的按钮并使用不同的样式在其位置创建一个新的按钮。在UIBarButtonItem看看this

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

欲了解更多信息:你可以调用这个方法。

5

UIBarButtonSystemItemPlayUIBarButtonSystemItemPause无法通过样式属性检索。样式是UIBarButtonItemStyle

检查文档here

我建议创建两个不同的UIBarButtonItem,然后交替启用或禁用它们(例如)。也可以删除当前可见按钮并添加一个不同的UIBarButtonSystemItem

2

下面是这个一个相当完整的解决方案,我只是执行:

首先,定义瓦尔持有两个按钮:

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

(在这里,我的理解是,该工具栏是一个弱的裁判,因为它是通过IB定义的,它有一个强大的指针,但是play/pause按钮是强指针,因为我们在下面创建它们。但是我的fu在这方面有点弱,因为这是一个相当新手,所以更正赞赏。 )

二,我n IB创建一个播放按钮(无暂停按钮)并将其绑定到上面的playButton变种。

第三,建立这种方法:

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

四,拨打setAsPlaying无论你要播放或暂停模式。例如:

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

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

另外,你不需要使用'strong'属性,因为无论如何你都会重新实现'UIBarButtonItem'。你可以在你的方法中使用一个本地'UIBarButtonItem'变量和'weak'属性。 – Vinzzz 2014-02-26 22:02:24

+0

你可以动态检索按钮的索引中删除,这样做'NSInteger的指数= [toolbarButtons indexOfObject:buttonToRemove]'然后'[toobarButtons replaceObjectAtIndex:指数withObject:buttonToAdd]' – Vinzzz 2014-02-26 22:07:13

+0

@Vinzzz:很好的补充,谢谢! – mowliv 2014-03-12 13:17:32

0

是的,一旦设置好了,你就不能改变“样式”(它实际上并不称为样式)。

是的,你可以制作另一个修复它的按钮。

下面是可重复使用的代码,不会认为:

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

在这里,控制器通常self是。

相关问题