UIBarButtonItems 不可见

UIBarButtonItems are not visible

我有一个 UIViewController 允许用户通过 UIImagePickerController select 照片或视频。一旦他们 select 其中一个图像被分配给一个名为 var selectedImage 的 属性 (如果他们 select 一个视频,有一种方法可以为该视频生成缩略图) .它按预期工作。

问题是我要处理2个UIBarButtonItem的状态。我想在 selectedImagenil 时禁用它们,并在有图像时设置 isEnabled

很简单,对吧?好吧,问题是最初它加载了 UIViewController,按钮被禁用并且可见,然后我 select 来自图库的照片, didFinishPickingMediaWithInfo 被调用并且在那里,我也调用handlePost() 应该处理按钮状态 (enabled/disabled) 的方法。好吧,出于某种原因,即使 selectedImage 中有图像,按钮也没有显示(实际上是不可见的,但据我所知,UIBarButtonItem 中没有 isHidden

他们仍然活跃,如果我点击他们(尽管没有看到他们)他们会做他们的工作。现在,问题是为什么它们不可见?我可以保证 Colors.tint 有一个值(我在整个应用程序中使用这个 class,它有效)并且 selectedImage 有一个值(我已经设置了一个断点并调用 handlePost() 方法,通过第一个 if 语句,其中 属性 有一个值。但是,我没有看到显示的按钮。问题是为什么?

@IBOutlet weak var clearButton: UIBarButtonItem!
@IBOutlet weak var filterButton: UIBarButtonItem!

var selectedImage: UIImage?

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    handlePost()
}

func handlePost() {
    if selectedImage != nil {
        clearButton.isEnabled = true
        clearButton.tintColor = Colors.tint
        filterButton.isEnabled = true
        filterButton.tintColor = Colors.tint
        shareButton.isEnabled = true
        shareButton.backgroundColor = Colors.tint
        shareButton.setTitleColor(.white, for: .normal)
    }
    else {
        clearButton.isEnabled = false
        clearButton.tintColor = .darkGray
        filterButton.isEnabled = false
        filterButton.tintColor = .darkGray
        shareButton.isEnabled = false
        shareButton.backgroundColor = .darkGray
        shareButton.setTitleColor(.lightGray, for: .normal)
    }
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let videoUrl = info[UIImagePickerController.InfoKey.mediaURL] as? URL {
        if let thumbnail = self.generateThumbnailForImage(videoUrl) {
            self.videoUrl = videoUrl
            self.photoImageView.image = thumbnail
            self.selectedImage = thumbnail
            handlePost()
        }
    }
    if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
        selectedImage = image
        photoImageView.image = image
        handlePost()
    }
    dismiss(animated: true, completion: nil)
}

正如我在评论中提到的,我不确定是什么问题,因为这不会发生。但简单的解决方案是删除 UIBarButtonItems 并用 UIButtons 代替它们。这成功了,现在他们正在按照他们应该的方式行事。