我试图更新一个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
不能更新?(注意,输出中没有出现错误)。
4条答案
按热度按时间42fyovps1#
UIStackView
bug(http://www.openradar.me/25087688)关于这一点,有一条线索:(Swift: Disappearing views from a stackView)。长话短说:这个错误是在堆栈视图中隐藏和显示视图是累积的。奇怪的苹果bug。如果在堆栈视图中两次隐藏视图,则需要显示两次才能将其恢复。
要解决此问题,您可以使用以下扩展:
zazmityj2#
用户界面上的更新总是必须在主线程上完成(THE LAW)。
因此,在主标题上 Package 您的UI更新:
5uzkadbs3#
尝试使用isHidden属性沿着alpha:
rn0zuynd4#
这仍然是iOS 16的一个活跃bug。所以@Timur Bernikovich的解决方案是唯一可行的解决方案。如果您不想添加任何扩展,则需要在更新之前检查
isHidden
。在主线程上运行它没有帮助,因为它会扰乱当前动画(如果您为UIStackView应用了任何动画)。因此,最好在更新view.isHidden
值之前检查更新值。例如: