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

时间:2012-01-05 08:52:17

标签: iphone objective-c ios

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

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

4 个答案:

答案 0 :(得分:5)

样式属性无法检索

UIBarButtonSystemItemPlayUIBarButtonSystemItemPause。 style的类型为UIBarButtonItemStyle

查看文档here

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

答案 1 :(得分:2)

这是我刚刚实施的一个非常完整的解决方案:

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

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

(我的理解是工具栏是一个弱参考,因为它是通过IB定义的,它有一个强大的指针,但是播放/暂停按钮是强指针,因为我们在下面创建它们。但是我的作为一个相当新手,福在这方面有点弱,所以修正得到了赞赏。)

其次,在IB中只创建一个播放按钮(没有暂停按钮)并将其绑定到上面的playButton var。

第三,设置此方法:

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

答案 2 :(得分:0)

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

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

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

有关UIBarButtonItem的更多信息,请查看this

答案 3 :(得分:0)

是的,一旦设置完毕,你就无法改变“风格”(它实际上并没有被称为风格)。

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

以下是可重复使用的代码:

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

此处,控制器通常为self