在 Swift 中重新加载 UIBarButtonItem

Reload a UIBarButtonItem in Swift

我正在尝试实施 favorite-marker 功能。我通过 Font Awesome Star 意识到了这一点。

现在我尝试在点击后重新加载 UIBarButtonItem,因为 Star 必须是满的或空的(取决于用户喜欢与否)。 我找不到这样做的任何选项:(

我的按钮声明:

 markedButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Done, target: self, action: "onMarkedTap:")
    if questionWithIdIsMarked(detailItem2!){
        markedButton.setFAIcon(FAType.FAStar, iconSize: 25)
    }else{
        markedButton.setFAIcon(FAType.FAStarO, iconSize: 25)
    }
    let navButtons = [shuffleBtn, markedButton]
    self.navigationItem.setRightBarButtonItems(navButtons, animated: true)

它首先尝试在 onMarkedTap(sender: UITapGestureRecognizersender.view?.reloadInputViews(),但这也没有用。问题是 UIBarButtonItem 不是从 UIView 继承的,所以重新加载它不是那么容易。

有什么想法吗?

此致, 帕特里克

首先声明两个普通按钮,如:

var btnFavourite:UIButton!
var btnShuffle:UIButton!

然后在viewDidLoad()中写入如下代码

self.btnFavourite = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton
self.btnFavourite.frame = CGRectMake(0, 0, 30, 30)
self.btnFavourite.setImage(UIImage(named: "blank_star.png"), forState: UIControlState.Normal)
self.btnFavourite.setImage(UIImage(named: "fill_star.png"), forState: UIControlState.Selected)
self.btnFavourite.addTarget(self, action: "favourite:", forControlEvents: UIControlEvents.TouchUpInside)

self.btnShuffle = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton
self.btnShuffle.frame = CGRectMake(0, 0, 30, 30)
self.btnShuffle.setImage(UIImage(named: "shuffle.png"), forState: UIControlState.Normal)
self.btnShuffle.addTarget(self, action: "shuffle:", forControlEvents: UIControlEvents.TouchUpInside)

let barButtons = [UIBarButtonItem(customView: self.btnFavourite), UIBarButtonItem(customView: self.btnShuffle)]
self.navigationItem.rightBarButtonItems = barButtons

并实现两个按钮的方法如下

@IBAction func favourite(sender:UIButton) {

    if self.btnFavourite.selected == true {

        self.btnFavourite.selected = false
    }
    else {

        self.btnFavourite.selected = true
    }
}

@IBAction func shuffle(sender:UIButton) {

    // your code
}