Ios Swift-uibarbuttoneim.customView-重置为原始状态

Ios Swift-uibarbuttoneim.customView-重置为原始状态,ios,swift,uibarbuttonitem,Ios,Swift,Uibarbuttonitem,我有一个导航栏按钮项,它在数据查询期间添加自定义活动指示器视图。查询完成后,我希望将按钮设置回其原始状态。这是我目前的代码: let filterActivityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 20, height: 20)) filterActivityIndicator.color = .yandasRed filterMenuNavButton.customView = filterA

我有一个导航栏按钮项,它在数据查询期间添加自定义活动指示器视图。查询完成后,我希望将按钮设置回其原始状态。这是我目前的代码:

let filterActivityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
filterActivityIndicator.color = .yandasRed
filterMenuNavButton.customView = filterActivityIndicator
filterActivityIndicator.startAnimating()
ProductsFilterData.searchShared.updateFilteredCollectionData(source: "Search") { (done) in
        filterActivityIndicator.stopAnimating()
        self.filterMenuNavButton.setBackgroundImage(#imageLiteral(resourceName: "icons8-slider-30"), for: .normal, barMetrics: .default)
}
我已经尝试将自定义背景设置为零,但没有任何作用。我尝试过重新设置bar按钮项的背景图像,但没有任何作用。有什么想法吗?谢谢

编辑:
我试图操纵的uibarbuttonite位于右侧,但右侧有两个条形按钮项
filtermanunavbutton
是我试图操作的特定按钮的IBOutlet。

有时失效是一个问题。似乎您需要再次将按钮设置到导航栏。它非常智能,您首先需要将其设置为
nil
,这样效果才会发生

这就是我试过的:

let buttonImage: UIImage = #imageLiteral(resourceName: "icons8-slider-30")

let filterMenuNavButton = UIBarButtonItem(image: buttonImage, style: .plain, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = filterMenuNavButton

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    let filterActivityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
    filterMenuNavButton.customView = filterActivityIndicator
    filterActivityIndicator.startAnimating()
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        filterActivityIndicator.stopAnimating()
        filterMenuNavButton.customView = nil
        filterMenuNavButton.setBackgroundImage(buttonImage, for: .normal, barMetrics: .default)
        self.navigationItem.rightBarButtonItem = nil
        self.navigationItem.rightBarButtonItem = filterMenuNavButton
    }
}
我不确定您的设置是什么,但我使用了一个简单的导航视图控制器,并将此代码放入当前(根)视图控制器的
viewdiload

最后一部分可能是您正在寻找的内容,您需要:

  • 将“自定义视图”设置为“清除”
  • 添加图像或更改其他按钮属性
  • 清除按钮项(设置为零)
  • 将按钮项设置回所需的位置
我希望这能解决你的问题。但我必须说,当指示器正在运行时,创建一个新的按钮项可能更有意义。检查以下各项:

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    let preservedButtonItem = self.navigationItem.rightBarButtonItem

    let filterActivityIndicator: UIActivityIndicatorView = {
        let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: activityIndicator)
        return activityIndicator
    }()

    filterActivityIndicator.startAnimating()
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        filterActivityIndicator.stopAnimating()
        self.navigationItem.rightBarButtonItem = preservedButtonItem
    }
}
guard let oldItems = navigationItem.rightBarButtonItems else {
    return
}

var newItems = oldItems

// Find the index of item so we may ereplace it
guard let index = newItems.index(where: { $0 === filterMenuNavButton }) else {
    return
}
let activityIndicator: UIActivityIndicatorView = {
    let activity = UIActivityIndicatorView()
    return activity
}()
newItems[index] = UIBarButtonItem(customView: activityIndicator)

navigationItem.rightBarButtonItems = newItems
DispatchQueue.main.asyncAfter(deadline: .now()+2.0) {
    self.navigationItem.rightBarButtonItems = oldItems
}
编辑:多个按钮

对于多个按钮,情况应该非常相似。请尝试玩以下游戏:

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    let preservedButtonItem = self.navigationItem.rightBarButtonItem

    let filterActivityIndicator: UIActivityIndicatorView = {
        let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: activityIndicator)
        return activityIndicator
    }()

    filterActivityIndicator.startAnimating()
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        filterActivityIndicator.stopAnimating()
        self.navigationItem.rightBarButtonItem = preservedButtonItem
    }
}
guard let oldItems = navigationItem.rightBarButtonItems else {
    return
}

var newItems = oldItems

// Find the index of item so we may ereplace it
guard let index = newItems.index(where: { $0 === filterMenuNavButton }) else {
    return
}
let activityIndicator: UIActivityIndicatorView = {
    let activity = UIActivityIndicatorView()
    return activity
}()
newItems[index] = UIBarButtonItem(customView: activityIndicator)

navigationItem.rightBarButtonItems = newItems
DispatchQueue.main.asyncAfter(deadline: .now()+2.0) {
    self.navigationItem.rightBarButtonItems = oldItems
}

使用“自定义视图”作为工具栏按钮项执行此操作没有问题:

fileprivate var underlyingButton: UIButton?

...

let barButton = UIButton(type: .custom)
barButton.addTarget(self, action: #selector(stuffs), for: .touchUpInside)
barButton.setImage(image, for: UIControlState())

let rightItem = UIBarButtonItem(customView: barButton)
self.filterMenuNavButton = rightItem

self.underlyingButton = barButton
然后,我可以打电话简单地做:

guard let button = underlyingButton else {
    return
}
button.setImage(someOtherImage, for: UIControlState())

谢谢你的回复。在我的原始代码中,FilterMemunavButton是我试图操纵的UIBarButton的IBOutlet。我使用插座的原因是有两个右栏按钮项。如果只有一个代码,那么您的代码很可能可以正常工作,但在这个特定的实例中对我来说就不行了。我应该说得更具体些——是我的错。我已经更新了这个问题,以反映这一疏忽。@AlexRitter我不认为会有太大的不同。您有一个属性
RightBarButtonims
,可以在其中替换按钮。检查我做的更新。效果很好。谢谢