在2011年WWDC会话102,苹果推出视图控制器遏制,这是创建定制的视图控制器容器的能力,类似于UITabBarController,UINavigationController和类似物.
我多次看过这些例子.有一系列与这种模式相关的方法,但有点难以弄清楚它们.我将在这里发布我认为正在发生的事情,看看社区是否会确认或否定我的怀疑.
场景1:从无父节点移动到新的父视图控制器
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)
前两行必须按给定的顺序发生,还是可以反转?
场景2:从父视图控制器移动到没有父视图控制器
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Run Code Online (Sandbox Code Playgroud)
还有必要打电话[vc didMoveToParentViewController:nil]吗?会话102中的示例在这种情况下没有这样做,但我不知道这是否是遗漏.
场景3:从一个父视图控制器移动到另一个父视图控制器
这可能以下列方式发生,因为将封装每个父视图控制器中的逻辑.
// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)
问题
我的主要问题是:一般来说,视图控制器包含应该如何工作?上面给出的机制是否正确?
是否有必要在打电话willMoveToParentViewController前打电话addChildViewController?这对我来说似乎是合乎逻辑的顺序,但它是否是必要的?
打电话didMoveToParentViewController:nil后有必要打电话removeFromParentViewController吗?
我正在为 UIKit寻找 AppKit 的NSHostingView的等效项,以便我可以在 UIKit 中嵌入 SwiftUI 视图。不幸的是,UIKit 没有与NSHostingView. 我们所拥有的最接近NSHostingController的等效项,名为UIHostingController。由于视图控制器包含视图,我们应该能够调用适当的 UIViewController 嵌入方法,然后view直接抓取并使用它。
目前 有 许多 文章解释,这是方式嵌入里面的UIKit一个SwiftUI视图。但是,他们通常无法解释您将如何通过UIKit 进行交流?斯威夫特用户界面。例如,假设我实现了一个用作进度条的 SwiftUI 视图,我希望定期更新进度。我希望我的旧版/UIKit 代码更新 SwiftUI 视图以显示新进度。
我发现的唯一一篇接近于解释如何操作嵌入视图的内容的文章建议我们这样做@ObservedObject:
import UIKit
import SwiftUI
import Combine
class CircleModel: ObservableObject {
var didChange = PassthroughSubject<Void, Never>()
var text: String { didSet { didChange.send() } }
init(text: String) {
self.text …Run Code Online (Sandbox Code Playgroud)