我有一个带有各种图像按钮的工具栏,在Interface Builder中创建。
我希望能够以编程方式在按下时用活动指示器替换其中一个按钮,然后放回原始按钮,但在活动完成时将其颜色从白色更改为黄色。
这是否可以使用IB构建的工具栏,还是我必须以编程方式和自定义视图构建整个工具栏?
答案 0 :(得分:26)
这是我在类似情况下所做的一个例子。我想使用Interface Builder构建工具栏,但根据是否“检查”来切换其中一个BarButtonItem。在这个例子中,有几个关键的事情需要注意。在头文件中为类定义了以下2个成员变量:
NSMutableArray *toolbarItems;
IBOutlet UIToolbar *toolbar;
NSUInteger checkUncheckIndex;
当我想更新已检查状态时,我调用此函数...请注意,在单击UIToolbar中的特定按钮时,会调用一个名为checkUncheckClicked的选择器。并且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和工具栏应该在你的dealloc中为类发布。
希望这有帮助!
答案 1 :(得分:2)
这是我使用的方法 以编程方式完全管理工具栏似乎要简单得多......
在视图控制器中声明一组或多组UIBarButtonItem项作为属性项也声明并将工具栏连接为UIToolbar属性。同时声明一个或多个数组来保存项目。
在实施中 在viewDidLoad中分配和设置你的UIBarButtonItems例如
playButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemPlay
target:self
action:@selector(handlePlayClick)];
灵活按钮(用于对齐等)声明如下
flexButton1 =[[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
target:nil action:nil];
有几种initMethod可以处理不同类型的按钮工具栏支持。所有都遵循类似于上面的语法。值得注意的是目标和行动设置。目标:通常是self,action是按钮应该触发的函数的名称。
在你的UIBarButtons分配后,使用initWithObjects将它们添加到一个数组中。
然后将按钮分配给工具栏,您可以调用
[toolbar setItems:<array name>];
不要忘记在代码末尾释放你的UIBarButtons和数组。
希望这会有所帮助。如果您需要更多代码,请告诉我。
Rich D。
答案 2 :(得分:2)
自这些答案发布以来,情况发生了很大变化。这是一个Swift 2.0解决方案。
重要的不是如何以编程方式创建您要替换的原始>>> 0.1 + 0.1 + 0.1 - 0.3 == 0
False
。您所需要的只是UIBarButtonItem
出口。要替换左边的第二项,请执行以下操作:
UIToolbar
答案 3 :(得分:2)
@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
}
}
}
答案 4 :(得分:1)
我认为这应该是可能的。您可以尝试为ViewController类中的特定按钮创建一个IBOutlet,并将IB中的按钮连接到该插座,或者您可以使用该UIToolbar实例的items属性(您确实有参考,不是吗? ?)并在其中找到合适的项目,创建一个带有修改项目的新NSArray,并将其设置回该toolbar.items属性。
HTH
答案 5 :(得分:0)
关于此的说明 - 工具栏将删除图标中的任何颜色,因此您仍然无法将其变为黄色。您需要更改图像形状以指示“打开”。
或者,您需要使用UIButtons加载BarButtonItems(使用initWithCustomView)并适当地设置按钮的图像。
HTH
答案 6 :(得分: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];
}
答案 7 :(得分:0)
对于您在IB中创建的整个工具栏(也就是说,不是单个工具栏项),创建一个IBOutlet:
@IBOutlet weak var toolbarThatYouMade: UIToolbar!
这是一个单独的工具栏项目数组,因此您将使用[0]
索引访问最左侧的成员(例如):
toolbarThatYouMade.items![0].image = UIImage(named: "New Image")
此代码假定您的资产中有一个名为“New Image”的图像。
然后,您可以触发工具栏项目的图像更改,而无需访问该特定项目本身;例如,如果您将其用于媒体播放器之类的东西,则可以切换暂停/播放图像:
a)暂停/播放按钮本身,
b)停止按钮,
c)当您收到有关球员状态变化的通知时,
或
d)其他完全。 (要勇敢!要大胆!做一些以'b'开头的东西!)