StackView isHidden属性未按预期更新

时间:2017-05-07 12:51:36

标签: ios swift uistackview

如果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? (注意输出中没有出现错误。)

3 个答案:

答案 0 :(得分:5)

用户界面上的更新必须始终在主线程(THE LAW)上完成。

所以请在主要的thead上包装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 )")
        }
    })

答案 1 :(得分:4)

这是已知的UIStackView错误(http://www.openradar.me/25087688)。关于SO,有一个线程:(Swift: Disappearing views from a stackView)。长话短说:

  

错误是在堆栈视图中隐藏和显示视图   累积的。奇怪的苹果错误。如果您两次在堆栈视图中隐藏一个视图,   您需要显示两次才能取回。

要解决此问题,您可以使用以下扩展名:

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

答案 2 :(得分:0)

尝试使用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