学习iOS并尝试找出共享"组件的最佳方式"跨多个屏幕。我使用程序化布局而没有使用故事板,这可能会使这比应该更难。
我有一个UIImageView绘制调色板选择器,带有相应的选择历史记录UICollectionView,用于以前选择的颜色,用于许多不同的屏幕。这些是数据源驱动的,并且还支持一些UI事件,如选择,滚动,拖动等。所有这些交互都冒泡到视图控制器,以便与此屏幕上的其他所有内容一起处理。这使得它很难重复使用,因为组件不是自包含的,而是通过UI处理传播到控制器的所有视图。我如何才能让这个东西自成一体,以便我可以将其放入多个屏幕而不需要复制代码?
答案 0 :(得分:2)
如果没有看到您的确切代码,我建议您将控制器嵌入另一个视图控制器的子控制器中。
documentation的示例:
- (void) displayContentController: (UIViewController*) content {
[self addChildViewController:content];
content.view.frame = [self frameForContentController];
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self];
}
这是一个Swift方法,您可以将其放入代码库中。它会延伸UIViewController
,因此在您的视图控制器的viewDidLoad
中,您只需拨打embed(myFancyNewChildController, withFrame: view.frame)
:
extension UIViewController {
func embed(childViewController: UIViewController, withFrame frame: CGRect) {
addChildViewController(childViewController)
childViewController.view.frame = frame
view.addSubview(childViewController.view)
childViewController.didMove(toParentViewController: self)
}
}
通过这种方式,您可以将视图控制器嵌入到您选择的另一个视图控制器中,并将其重新用于其他地方。换句话说,所有这些移动部件都被封装到整个控制器中,您可以在其他地方重复使用。如上例所示,您还可以相应地调整子控制器的框架。
为简单起见,您可以将其视为view.addSubview(mySubview)
方法,但使用整个视图控制器。