将单个iOS屏幕分解为可重用的组件视图

时间:2018-01-09 07:46:32

标签: ios swift

学习iOS并尝试找出共享"组件的最佳方式"跨多个屏幕。我使用程序化布局而没有使用故事板,这可能会使这比应该更难。

我有一个UIImageView绘制调色板选择器,带有相应的选择历史记录UICollectionView,用于以前选择的颜色,用于许多不同的屏幕。这些是数据源驱动的,并且还支持一些UI事件,如选择,滚动,拖动等。所有这些交互都冒泡到视图控制器,以便与此屏幕上的其他所有内容一起处理。这使得它很难重复使用,因为组件不是自包含的,而是通过UI处理传播到控制器的所有视图。我如何才能让这个东西自成一体,以便我可以将其放入多个屏幕而不需要复制代码?

1 个答案:

答案 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)方法,但使用整个视图控制器。