在 UIToolbar 上切换 UIBarButtonItem

Toggle UIBarButtonItem on UIToolbar

我想将 play/pause 类型的按钮添加到 UIToolbar,但我不确定如何在代码中访问该按钮。我尝试为按钮添加一个插座并以这种方式更改它,但它并没有以这种方式更改,所以我显然做得不正确。

@IBOutlet weak var playPauseButton: UIBarButtonItem!

func toggleButton() {

    playPauseButton = UIBarButtonItem(barButtonSystemItem: .Stop, target: self, action: "stop:")

}

编辑:我想出的解决方案如下:

(感谢 wltrup 为我指明了正确的方向!)

var isActive = false
@IBOutlet weak var toolbar: UIToolbar!
@IBAction func playPauseButton(sender: AnyObject) {
    if (!isActive) {
        play()
        swapPlayPauseButton(.Pause)
    } else {
        pause()
        swapPlayPauseButton(.Play)
    }
    isActive = !isActive
}

func swapPlayPauseButton(barButtonSystemItem: UIBarButtonSystemItem) {
    var items = [AnyObject](toolbar.items!)
    items[2] = UIBarButtonItem(barButtonSystemItem: barButtonSystemItem, target: self, action: "playPauseButton:")
    toolbar.setItems(items, animated: true)
}

或者,使用 wltrup 建议的 属性 观察者的解决方案:

var timer: NSTimer? {
    didSet {
        isActive = (timer != nil)
        if timer == nil {
            swapPlayPauseButton(.Play)
        } else {
            swapPlayPauseButton(.Pause)
        }
    }
}

@IBAction func playPauseButton(sender: AnyObject) {
    if (!isActive) {
        play()
    } else {
        pause()
    }
}

func swapPlayPauseButton(barButtonSystemItem: UIBarButtonSystemItem) {
    var items = [AnyObject](toolbar.items!)
    items[2] = UIBarButtonItem(barButtonSystemItem: barButtonSystemItem, target: self, action: "playPauseButton:")
    toolbar.setItems(items, animated: true)
}

您需要更新工具栏的 items 属性,可以直接(但不是动画)或使用 setItems:animated: 方法。查看 Configuring Toolbar Items.

UIToolbar 的文档