动态加载的 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 的动态高度

如何禁用分离实例关系上的 SQLAlchemy 延迟加载?

嵌入在 UIStackView 中的 UITableView 不会重新加载数据

UITableViewCell 中的 UIStackView 中的 UICollectionview

将视图动态添加到 UIStackview

动态 UIStackView 与普通约束