【发布时间】:2016-02-12 02:12:17
【问题描述】:
我的应用有 2 个屏幕:
TableViewVC(这里没有堆栈视图)
DetailVC(这里所有嵌套的堆栈视图;请参阅图片链接:Nested StackViews Picture)——注意,这些堆栈视图中有标签和图像。
当您在表格视图中按下一个单元格时,它会将信息从 TableViewVC 传递到 DetailVC。问题在于 在 DetailVC 中隐藏特定的 UIStackViews。 我希望在 DetailVC 中的各种堆栈视图中,只要视图加载后立即隐藏 2 个堆栈视图。所以我在DetailVC中写了这段代码来完成这个:
override func viewDidLoad() {
super.viewDidLoad()
self.nameLabel.text = "John"
self.summaryStackView.hidden = true
self.combinedStackView.hidden = true
}
一切看起来都不错,但 Xcode 仅在 运行时 给出许多警告。当应用程序未运行时,Storyboard 中没有警告。错误图片请看链接:Picture of Errors
基本上这是很多 UISV-hiding、UISV-spacing、UISV-canvas-connection 错误。如果我在viewDidAppear 中隐藏相同的堆栈视图,这些错误就会消失,但随后会出现本应隐藏的内容,然后将其隐藏。用户短暂地看到视图,然后隐藏起来,这是不好的。
很抱歉无法实际发布图片而不是链接,但仍然不能这样做。
关于如何解决此问题的任何建议?这是针对我真正想要发布到应用商店的应用程序 - 这是我的第一个应用程序,所以任何帮助都会很棒!
编辑/更新 1:
我找到了一个解决此代码的小方法,我将它放在名为 DetailVC 的第二个屏幕中:
// Function I use to delay hiding of views
func delay(delay: Double, closure: ()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
// Hide the 2 stack views after 0.0001 seconds of screen loading
override func awakeFromNib() {
delay(0.001) { () -> () in
self.summaryStackView.hidden = true
self.combinedStackView.hidden = true
}
}
// Update view screen elements after 0.1 seconds in viewWillAppear
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
delay(0.1) { () -> () in
self.nameLabel.text = "John"
}
}
这完全摆脱了 Xcode 中有关布局约束的警告。
它仍然不完美,因为有时我会瞥见应该隐藏的视图 - 它们在屏幕上快速闪烁然后消失。不过这发生得太快了。
关于为什么这会消除警告的任何建议?另外,关于如何改进它以使其完美运行的任何建议???谢谢!
【问题讨论】:
-
问题是约束冲突。在 viewDidLoad 的末尾尝试
self.view.layoutIfNeeded()之类的东西? -
@Tim 嘿,感谢您的回复。刚刚尝试了您的建议,警告仍然出现。顺便说一句,我用 viewDidLoad 中的其他内容更新了我的问题——我更新了一个标签和其他一些东西,但为了简单起见,我只放了一个标签。你认为我应该在其他任何地方打电话给
layoutIfNeeded吗? -
这取决于您在情节提要中的布局。您需要在那里使用自动约束,或者可能在更改发生后以编程方式设置约束。这里有很多关于如何做到这一点的答案。有时有用的另一行是
self.view.translatesAutoresizingMaskIntoConstraints = false。你可以在 layoutIfNeeded 之前尝试一下。我只是把我尝试过的所有东西都拍出来,这就是为什么我实际上没有答案。祝你好运! -
@Tim 刚试过
self.view.translatesAutoresizingMaskIntoConstraints = false-- 当我从第一个屏幕单击一个单元格以显示第二个屏幕时,第二个屏幕显示并以半黑屏幕开始,然后完全黑除了导航栏。无论如何感谢您的建议! -
为什么不把视图隐藏在故事板中而不是隐藏在 viewDidLoad 中呢?顺便说一句,如果您使用视图控制器,通常不需要 awakeFromNib,请改用 viewDidLoad。
标签: ios swift uistackview