如何在代码中更改UIBarButtonItem的样式

9

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

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

1
你尝试过使用 == 而不是 = 吗?无论如何,我会使用一个 ivar bool 标志来检查音频是否正在播放。 - Mat
哦,抱歉!非常感谢,我会检查一下,稍后再联系你。 - Khalid Usman
我已经检查过了,但它还是不起作用。 - Khalid Usman
无法通过 style 属性检索 UIBarButtonSystemItemstyle 的类型为 UIBarButtonItemStyle - Lorenzo B
UIBarButtonItem必须使用此答案中描述的方法进行替换。 - brainjam
嗨@KhalidUsman,我想问一下下面的任何答案是否对您有所帮助? - William Entriken
4个回答

5

UIBarButtonSystemItemPlayUIBarButtonSystemItemPause无法通过样式属性检索。 样式的类型为UIBarButtonItemStyle

在此处查看文档

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


2

这是一个我刚实现的相当完整的解决方案:

首先,定义变量来保存两个按钮:

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

我的理解是工具栏是一个弱引用,因为它是通过IB定义的,并且它对它有一个强指针,但播放/暂停按钮是强指针,因为我们在下面创建它们。但作为相当新手,我在这方面可能有些不足之处,所以请指正。

其次,在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];
}

此外,您不需要使用strong属性,因为您无论如何都会重新实例化UIBarButtonItem。您可以在方法中使用本地的UIBarButtonItem变量和weak属性。 - Vinzzz
可以通过以下方式动态检索要删除的按钮的索引:NSInteger index = [toolbarButtons indexOfObject:buttonToRemove],然后使用 [toobarButtons replaceObjectAtIndex:index withObject:buttonToAdd] 进行替换。 - Vinzzz

0

我相信一旦样式被初始设置(即在界面构建器中或在代码中创建按钮时)后,就无法更改。

你唯一的选择是在代码中删除该按钮,并使用不同的样式创建一个新的按钮来代替它。你可以调用这个方法:

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

想要了解更多关于 UIBarButtonItem 的信息,请查看this


0

是的,一旦设置了“样式”(实际上并不叫做样式),就无法更改。

是的,您可以创建另一个按钮来修复它。

这里是可重用的代码:

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

这里,控制器通常是self

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接