ios - Swift - UIBarButtonItem.customView - 重置为原始状态

标签 ios swift uibarbuttonitem

我有一个导航栏按钮项,它在数据查询期间添加了自定义事件指示器 View 。查询完成后,我想将按钮设置回其原始状态。这是我当前的代码:

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

我试过将自定义背景设置为 nil,但没有任何效果。我试过重新设置条形按钮项目的背景图像,但没有任何作用。有任何想法吗?谢谢!

编辑: 我要操作的 UIBarButtonItem 位于右侧,但右侧有两个栏按钮项。 filterMenuNavButton 是我尝试操作的特定按钮的 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
    }
}

我不确定你的设置是什么,但我采用了一个简单的导航 View Controller 并将这段代码放在它当前(根) View Controller 的 viewDidLoad 中。

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

  • 设置自定义 View 以清除
  • 添加图片或更改其他按钮属性
  • 清除按钮项(设置为 nil)
  • 将按钮项设置回所需的项

希望这能解决您的问题。我必须说,在指示器运行时创建一个新的按钮项可能更有意义。检查以下内容:

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
}

关于ios - Swift - UIBarButtonItem.customView - 重置为原始状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50936398/

相关文章:

swift - 当 UITableView 为空时显示消息

ios - UIBarButtonItem 取消不起作用

ios - 从 UIViewController 呈现 UINavigationController 没有默认的取消按钮

ios - transferCurrentComplicationUserInfo 和 ComplicationController

ios - fatal error 索引超出范围(Swift 2.3)

ios - 动画在某些 View Controller 中不起作用

ios - UIBarButtonItem 样式被忽略?

iphone - 尝试以编程方式向 UINavigationController 添加按钮,但它从未显示

ios - 为什么 nspredicate 不起作用

ios - App Store Connect 拒绝应用发布,说 "Missing Purpose String in Info.plist",但该应用不需要这些权限