动态加载的 UIStackView 上的分离控制器问题
Posted
技术标签:
【中文标题】动态加载的 UIStackView 上的分离控制器问题【英文标题】:Detached Controller Issues on a Dynamically Loaded UIStackView 【发布时间】:2016-06-10 04:07:03 【问题描述】:在某种专门的架构中,我收到“不鼓励在分离的视图控制器上显示视图控制器”警告。并且 - 它会导致一些相当大的 UI 问题。我的故事板中有一个包含 2 个不同的未连接组的架构。第一组是我的应用程序的主界面,包括一个 UIStackView。第二组由 UIView 和附加的 popover segue 组成,如下图所示。
我使用组 2 的 UIView 的最多 8 个实例动态填充组 1 的 UIStackView。这是在 UIStackView 子类中名为 loadViews() 的函数中完成的,该函数根据需要调用。以下是清理后的伪代码用于说明:
for i in 0 ..< green.count
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let greenVC = storyboard.instantiateViewControllerWithIdentifier("greenViewController") as! GreenVC
greenVC.progressionStackView = self
greenVC.index = i;
greenViewControllers.append(greenVC)
if let greenView = greenVC.view as! GreenView!
greenView.fillColor = UIColor.orangeColor()
greenView.setNeedsDisplay()
self.addArrangedSubview(greenView)
self.layoutIfNeeded()
每次我在堆栈视图中的一个嵌入式绿色视图上触发弹出框时,我都会收到来自上方的警告。更重要的是,在 iPad 上以拆分视图模式运行时,堆栈视图每次都会丢失一个绿色视图,直到没有剩余视图为止。后者只是一个显示问题,因为刷新时所有视图都回来了。
我完全被难住了,不知道如何解决这个问题或以不同的方式实现。如果问题是未附加加载的视图,是否可以“重新附加”它们?或者有没有办法动态加载最多附加 256 个视图的堆栈视图?
【问题讨论】:
【参考方案1】:已解决:
另一个将 Xcode 警告牢记在心的教训 - 即使使用了“劝阻”这个词。在这种情况下,事情往往会破裂。事后看来,解决方案是显而易见的。被实例化为 greenVC 的新视图控制器必须附加到包含视图控制器 - 即包含此 UIStackView 的视图层次结构中的上几层:
vcContainingStackView.addChildViewController(greenVC)
在将 greenVC 添加到我添加的视图控制器数组之前调用了上面的行。当然,现在也必须调用 removeFromParentViewController() 来删除 GreenVC 的实例,否则就是这样。警告消失了,视图消失的问题也消失了。
【讨论】:
以上是关于动态加载的 UIStackView 上的分离控制器问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 UIStackView 的 UITableViewCell 的动态高度
嵌入在 UIStackView 中的 UITableView 不会重新加载数据