12

我有一个带有各种图像按钮的工具栏,在 Interface Builder 中创建。

我希望能够在按下时以编程方式将其中一个按钮替换为活动指示器,然后放回原始按钮,但在活动完成时将其颜色从白色更改为黄色。

这可以通过 IB 构建的工具栏实现,还是我必须查看以编程方式构建整个工具栏和自定义视图?

4

8 回答 8

26

这是我在类似情况下所做的一个示例。我想使用 Interface Builder 构建工具栏,但根据是否“选中”来切换 BarButtonItems 之一。在此示例中,需要注意一些关键事项。在头文件中为类定义了以下2个成员变量:

NSMutableArray *toolbarItems;
IBOutlet UIToolbar *toolbar;
NSUInteger checkUncheckIndex;

当我想更新检查状态时,我调用此函数...请注意,定义了一个名为 checkUncheckClicked 的选择器,当单击 UIToolbar 中的特定按钮时会调用该选择器。并且 UIToolbar 被设置为工具栏的 IBOutlet。或者,您可以将 UIBarButtonItem 本身作为插座连接,并将其用作识别按钮索引的逻辑,或者就此而言,如果事情不会随着时间而改变,您可以对按钮的索引进行硬编码。最后,项目中包含一个 checked.png 和 unchecked.png 可以在它们之间交替。

- (void)updateBarButtonItemChecked:(BOOL)checked {
    if (toolbarItems == nil) {
        toolbarItems = [[NSMutableArray arrayWithArray:toolbar.items] retain];
        checkUncheckIndex = -1;

        for (NSUInteger i = 0; i < [toolbarItems count]; i++) {
            UIBarButtonItem *barButtonItem = [toolbarItems objectAtIndex:i];
            if (barButtonItem.action == @selector(checkUncheckClicked)) {
                favoriteIndex = i;
                break;
            }
        }
    }

    if (checkUncheckIndex != -1) {
        UIBarButtonItem *barButtonItem = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:checked ? @"checked.png" : @"unchecked.png"] 
                                                                           style:UIBarButtonItemStylePlain target:self action:@selector(checkUncheckClicked)] autorelease];
        [toolbarItems replaceObjectAtIndex:checkUncheckIndex withObject:barButtonItem];

        toolbar.items = toolbarItems;
    }
}

而且,当然toolbarItems 和toolbar 应该在你的dealloc 中为类释放。

希望这可以帮助!

于 2009-08-18T18:05:22.980 回答
2

这是我使用的方法完全以编程方式管理工具栏似乎要简单得多,所以......

在您的视图控制器中,将一组或多组 UIBarButtonItem 项声明为属性项,并将工具栏声明并连接为 UIToolbar 属性。还要声明 1 个或多个数组来保存项目。

在实现中 viewDidLoad alloc 并设置你的 UIBarButtonItems 例如

       playButton = [[UIBarButtonItem alloc]
         initWithBarButtonSystemItem:UIBarButtonSystemItemPlay 
    target:self 
action:@selector(handlePlayClick)];

像这样声明灵活按钮(用于对齐等)

   flexButton1 =[[UIBarButtonItem alloc]
 initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
target:nil action:nil];

有几个 initMethods 来处理不同类型的按钮工具栏支持。都遵循与上述类似的语法。值得注意的是目标和动作设置。Target:通常是 self,action 是按钮应该触发的功能的名称。

在分配你的 UIBarButtons 之后,使用 initWithObjects 将它们添加到一个数组中。

然后将按钮分配给您将调用的工具栏

[toolbar setItems:<array name>];

不要忘记在代码末尾释放您的 UIBarButtons 和数组。

希望这可以帮助。如果您需要更多代码,请告诉我。

丰富的 D。

于 2009-07-15T17:09:25.697 回答
2

迅速

自从发布这些答案以来,情况发生了很大变化。这是一个 Swift 2.0 解决方案。

您要替换的原始文件是如何以UIBarButtonItem编程方式创建的并不重要。你所需要的只是UIToolbar插座。例如,要替换左侧的第二个项目,请执行以下操作:

var toolbarItems = self.toolbar.items
let newItem = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "play")
toolbarItems![1] = newItem
self.toolbar.setItems(toolbarItems, animated: true)
于 2015-09-23T08:05:47.980 回答
2

Swift 有一个更简单的方法。就我而言,我每次触摸都会用暂停按钮切换播放按钮。

@IBAction func playandPause(sender: UIBarButtonItem) { // Here we are creating an outlet. Hook this up to the bar button item.
    for (index, button) in toolbarItems!.enumerate() { // Enumerating through all the buttons
        if button === sender { // === operator is used to check if the two objects are the exact same instance in memory.
            var barButtonItem: UIBarButtonItem!
            if mediaplayer.playing {
                mediaplayer.pause()
                barButtonItem = UIBarButtonItem.init(barButtonSystemItem: .Play, target: self, action: #selector(playandPause(_:)))
            }else {
                mediaplayer.play()
                barButtonItem = UIBarButtonItem.init(barButtonSystemItem: .Pause, target: self, action: #selector(playandPause(_:)))
            }
            toolbarItems![index] = barButtonItem // Replace the old item with the new item.
            break // Break once we have found the button as it is unnecessary to complete the rest of the loop
        }
    }
}
于 2016-05-02T22:29:23.493 回答
1

我认为这应该是可能的。您可以尝试在 ViewController 类中为该特定按钮创建一个 IBOutlet ,并将按钮从 IB 连接到该插座,或者您可以使用该 UIToolbar 实例的 items 属性(您确实对此有参考,不是吗? ?) 并在那里找到适当的项目,创建一个带有修改项目的新 NSArray,并将其设置回那个 toolbar.items 属性。

高温高压

于 2009-07-03T10:01:32.910 回答
0

关于这一点的注意事项 - 工具栏会去除图标中的任何颜色,因此您仍然无法将其设为黄色。您需要更改图像形状以指示“打开”。

或者,您需要使用 UIButtons 加载 BarButtonItems(使用 initWithCustomView)并适当地设置按钮的图像。

高温高压

于 2010-02-06T21:51:00.580 回答
0

尝试:

- (void)setTitle:(NSString *)title forItem:(int)item ofToolbar:(UIToolbar *)tb {
    NSMutableArray *newItems = [tb.items mutableCopy];
    UIBarButtonItem *old = [newItems objectAtIndex:1],
    *titled = [[UIBarButtonItem alloc] initWithTitle:title style:old.style target:old.target action:old.action];

    [newItems  replaceObjectAtIndex:1 withObject:titled];
    tb.items = newItems;

    [titled release];
}
于 2010-04-09T07:10:01.640 回答
0

对于您在 IB 中创建的整个工具栏(也就是说,不是单个工具栏项),创建一个 IBOutlet:

@IBOutlet weak var toolbarThatYouMade: UIToolbar!

[0]这是一个单独的工具栏项的数组,因此您可以使用索引访问最左边的成员(例如) :

toolbarThatYouMade.items![0].image = UIImage(named: "New Image")

此代码假定您的资产中有一个名为“新图像”的图像。

然后,您可以触发工具栏项的图像更改,而无需访问该特定项本身;例如,如果您将其用于媒体播放器之类的东西,则可以从以下位置切换暂停/播放图像:
a)暂停/播放按钮本身,
b)停止按钮,
c)当您收到播放器更改的通知时状态,

d)完全不同的东西。(勇敢点!大胆点!成为以“b”开头的其他东西!)

于 2016-05-29T00:08:19.103 回答