如何以编程方式替换IB中内置的UIToolBar项

时间:2009-07-03 09:34:46

标签: iphone interface-builder uitoolbar

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

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

这是否可以使用IB构建的工具栏,还是我必须以编程方式和自定义视图构建整个工具栏?

8 个答案:

答案 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'开头的东西!)