StackView isHidden 属性未按预期更新
StackView isHidden attribute not updating as expected
我正在尝试更新 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
无法更新的原因是什么? (注意输出中没有出现错误)。
用户界面的更新总是必须在主线程上完成(定律)。
所以给你包起来 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 )")
}
})
尝试与 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
这是已知 UIStackView
错误 (http://www.openradar.me/25087688). There is a thread on SO about it: ()。长话短说:
The bug is that hiding and showing views in a stack view is
cumulative. Weird Apple bug. If you hide a view in a stack view twice,
you need to show it twice to get it back.
要解决此问题,您可以使用以下扩展:
extension UIView {
var isHiddenInStackView: Bool {
get {
return isHidden
}
set {
if isHidden != newValue {
isHidden = newValue
}
}
}
}
我正在尝试更新 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
无法更新的原因是什么? (注意输出中没有出现错误)。
用户界面的更新总是必须在主线程上完成(定律)。
所以给你包起来 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 )")
}
})
尝试与 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
这是已知 UIStackView
错误 (http://www.openradar.me/25087688). There is a thread on SO about it: (
The bug is that hiding and showing views in a stack view is cumulative. Weird Apple bug. If you hide a view in a stack view twice, you need to show it twice to get it back.
要解决此问题,您可以使用以下扩展:
extension UIView {
var isHiddenInStackView: Bool {
get {
return isHidden
}
set {
if isHidden != newValue {
isHidden = newValue
}
}
}
}