swift StackView isHidden属性未按预期更新

dsekswqp  于 2023-05-27  发布在  Swift
关注(0)|答案(4)|浏览(193)

我试图更新一个UIStackView,以便显示一个字段,如果一个UITextField的值等于"Other"。下面是我的代码:

@IBOutlet var stackView: UIStackView!
func updateView() {
    print("UPDATING")
    UIView.animate(withDuration: 0.25, animations: { () -> Void in
         if(self.myTextField.text! == "Other") {
              print("SHOWING")
              self.stackView.arrangedSubviews[3].isHidden = false
         } else {
              print("HIDING")
              self.stackView.arrangedSubviews[3].isHidden = true
         }
         print("Is hidden: \(self.stackView.arrangedSubviews[3].isHidden )")
    })

示例输出如下所示:

> UPDATING
> HIDING
> Is hidden: true
> UPDATING
> SHOWING
> Is hidden: true

正如您所看到的,isHidden属性被报告为true,而不管上面的代码将其设置为什么。我真的不知道为什么,但也许这里有人可以?有什么明显的东西要检查吗?为什么isHidden不能更新?(注意,输出中没有出现错误)。

42fyovps

42fyovps1#

UIStackView bug(http://www.openradar.me/25087688)关于这一点,有一条线索:(Swift: Disappearing views from a stackView)。长话短说:
这个错误是在堆栈视图中隐藏和显示视图是累积的。奇怪的苹果bug。如果在堆栈视图中两次隐藏视图,则需要显示两次才能将其恢复。
要解决此问题,您可以使用以下扩展:

extension UIView {
    var isHiddenInStackView: Bool {
        get {
            return isHidden
        }
        set {
            if isHidden != newValue {
                isHidden = newValue
            }
        }
    }
}
zazmityj

zazmityj2#

用户界面上的更新总是必须在主线程上完成(THE LAW)。
因此,在主标题上 Package 您的UI更新:

@IBOutlet var stackView: UIStackView!
func updateView() {
    print("UPDATING")
    UIView.animate(withDuration: 0.25, animations: { () -> Void in
        DispatchQueue.main.async {  // UI updates on the main thread
            if(self.myTextField.text! == "Other") {
                print("SHOWING")
                self.stackView.arrangedSubviews[3].isHidden = false
             } else {
                print("HIDING")
                self.stackView.arrangedSubviews[3].isHidden = true
             }
             print("Is hidden: \(self.stackView.arrangedSubviews[3].isHidden )")
        }
    })
5uzkadbs

5uzkadbs3#

尝试使用isHidden属性沿着alpha:

self.stackView.arrangedSubviews[3].isHidden = true
self.stackView.arrangedSubviews[3].alpha = 0

self.stackView.arrangedSubviews[3].isHidden = false
self.stackView.arrangedSubviews[3].alpha = 1
rn0zuynd

rn0zuynd4#

这仍然是iOS 16的一个活跃bug。所以@Timur Bernikovich的解决方案是唯一可行的解决方案。如果您不想添加任何扩展,则需要在更新之前检查isHidden。在主线程上运行它没有帮助,因为它会扰乱当前动画(如果您为UIStackView应用了任何动画)。因此,最好在更新view.isHidden值之前检查更新值。例如:

var stackView: UIStackView!

    func isSectionActive(_ isActive: Bool) {
      UIView.animate(withDuration: 0.3) { [weak self] in
          self?.stackView.arrangedSubviews.forEach {
              // Active bug on UIStackView 👉🏻 http://www.openradar.me/25087688
              // So do not hide a subview twice
              if $0.isHidden != !isActive {
                  $0.isHidden = !isActive
                  $0.alpha = isActive ? 1.0 : 0.0
              }
          }
          self?.stackView.layoutIfNeeded()
      }
    }

相关问题