我如何更改代码中的UIBarButtonItem风格

我正在使用UIBarButtonSystemItemPlay播放我的audio文件,并且当我点击它时,我想dynamic地改变它的样式。 有可能吗?如果是的话请帮助我。 这是我的代码,其中_playPause是UIBarButtonSystemItemPlay的IBOutlet。 提前致谢。

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

UIBarButtonSystemItemPlayUIBarButtonSystemItemPause不能通过style属性检索。 样式是UIBarButtonItemStyletypes的。

在这里检查文档。

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

这是我刚刚实现的一个非常完整的解决scheme:

首先,定义variables来保存两个button:

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

(我的理解是这个工具栏是一个弱引用,因为它是通过IB来定义的,它有一个强大的指针,但是由于我们在下面创build它们,所以play / pausebutton是强指针。在这方面作为一个相当新手有点弱,所以更正赞赏。)

其次,在IB创build一个播放button(没有暂停button),并将其绑定到上面的playButton变种。

三,build立这个方法:

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

我相信,一旦风格设置最初(即在界面生成器或当你在代码中创buildbutton),你不能改变它。

您唯一的select是删除代码中的button,并使用不同的样式在其位置创build一个新的button。 你可以调用这个方法:

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

有关UIBarButtonItem更多信息,请看看这个 。

是的,一旦设置了,就不能改变“风格”(它实际上不是风格)。

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

这是可重用的代码,这样做:

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

在这里,控制器通常是self