如何以编程方式替换内置IB UIToolBar项目(How to programmatically

2019-06-24 21:47发布

我有不同的图像按钮,在Interface Builder创建的工具栏。

我希望能够在按下时以编程方式替换按钮中的一个与活动的指标,然后放回原来的按钮,但活动结束时,改变从白色的颜色为黄色。

这可能与一个IB内置工具栏或我必须着眼于编程的方式构建整个工具栏和自定义视图?

Answer 1:

下面是我在一个类似的情况做了一个例子。 我想建立使用界面生成器工具栏,但切换基于它是否被“选中”的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和工具栏的应该在您的dealloc的类被释放。

希望这可以帮助!



Answer 2:

下面是我用它似乎是更简单的管理工具栏完全编程这样的做法....

在您的视图控制器声明1组或多组的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处理不同类型的按钮工具栏支持。 都遵循类似上述语法。 值得注意的是目标和操作设置。 目标:通常是自我,动作是按钮会触发该功能的名称。

alloc'ng后您的UIBarButtons它们添加到使用initWithObjects数组。

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

[toolbar setItems:<array name>];

不要忘了你的代码年底的dealloc您UIBarButtons和数组。

希望这可以帮助。 如果您需要更多的代码,让我知道。

丰富D.



Answer 3:

迅速

发生了很大变化,因为这些答案已经公布。 这里是一个夫特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)


Answer 4:

斯威夫特有一个更简单的方法。 就我而言,我切换与暂停键每一个接触的播放按钮。

@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
        }
    }
}


Answer 5:

我认为应该是可能的。 你可能要么试着在你的ViewController类特定的按钮创建一个IBOutlet,并从IB连接按钮,即出口,或者您可以使用UIToolbar实例(你必须是一个参考,不要你的项目属性?),并发现有合适的项目,创建一个新的NSArray与修改的项目,并设置回上toolbar.items财产。

HTH



Answer 6:

基于此的一个音符 - 工具栏将去掉任何颜色的图标,所以你仍然不能令它发黄。 你需要改变图像形状以表示“对”代替。

或者你需要与UIButtons加载您BarButtonItems(使用initWithCustomView)并相应地设置按钮的图像。

HTH



Answer 7:

尝试:

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


Answer 8:

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

@IBOutlet weak var toolbarThatYouMade: UIToolbar!

这是个别工具栏项的阵列,所以你将与访问最左边的部件(例如) [0]指数:

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

此代码假定你有你的资产名为“新形象”的图像。

然后,您可以触发一个工具栏项目中的图像改变,而无需访问特定项目本身; 例如,如果你使用这个东西就像一个媒体播放器,你可以切换暂停/播放图片来自:
一)暂停/播放按钮本身,
b)该停止按钮,
C)收到通知后,球员状态的变化,
要么
d) 其他完全什么 。 (勇敢!要大胆!是别的东西,与“B”开始了!)



文章来源: How to programmatically replace UIToolBar items built in IB