首页 > 解决方案 > 我们应该使用 UIView 还是 UIViewController 来实现以下功能?

问题描述

我们有以下应用程序,用户可以在其中从侧面菜单切换到不同的“页面”(紫色、黄色、...颜色)。

在此处输入图像描述

我想知道,“页面”应该实现为UIView,还是“页面”应该实现为UIViewController

页面应负责

目前,我的使用实现UIView如下。

private func archive() {
    if let trashView = self.trashView {
        trashView.removeFromSuperview()
        self.trashView = nil
    }
    
    if self.archiveView != nil {
        return
    }
    
    let archiveView = ArchiveView.instanceFromNib()
    
    self.view.addSubview(archiveView)
    archiveView.translatesAutoresizingMaskIntoConstraints = false
    archiveView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
    archiveView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
    archiveView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
    archiveView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
    
    self.archiveView = archiveView
}

private func trash() {
    if let archiveView = self.archiveView {
        archiveView.removeFromSuperview()
        self.archiveView = nil
    }
    
    if self.trashView != nil {
        return
    }
    
    let trashView = TrashView.instanceFromNib()
    
    self.view.addSubview(trashView)
    trashView.translatesAutoresizingMaskIntoConstraints = false
    trashView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
    trashView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
    trashView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
    trashView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
    
    self.trashView = trashView
}

我注意到,如果我使用 实现“页面” UIView,我将失去一些UIViewController类似的能力

但是,我不清楚失去这些功能是否会阻止我实现正确的“页面”?

我可以知道,我应该使用UIView还是使用 来实现那些“页面” UIViewController

标签: iosswiftuikit

解决方案


UIViewController由于您已经在问题中列出的所有 UIKit 回调原因,我会这样做。

我假设您有一个为您的应用程序UINavigationController设置的实例window.rootViewController。您有一个对这个实例的引用,您可以使用它在不同的屏幕之间轻松切换。

例子

class SlideMenuViewController: UIViewController {
    enum Option {
        case archive
        case trash
    }
    
    var onSelect: ((_ option: Option) -> Void)?
}

class ArchiveViewController: UIViewController {}
class TrashViewController: UIViewController {}

class AppNavigator {
    
    let mainNavigationController: UINavigationController
    init(navigationController: UINavigationController) {
        self.mainNavigationController = navigationController
    }
    
    private lazy var slideMenuVC: SlideMenuViewController = {
        let slideMenu = SlideMenuViewController()
        slideMenu.onSelect = { [weak self] (option) in
            self?.openScreen(for: option)
        }
        return slideMenu
    }()
    
    private lazy var archiveVC: ArchiveViewController = {
        return ArchiveViewController()
    }()
    
    private lazy var trashVC: TrashViewController = {
        return TrashViewController()
    }()
    
    func openScreen(for option: SlideMenuViewController.Option) {
        let targetVC: UIViewController
        switch option {
        case .archive: targetVC = archiveVC
        case .trash: targetVC = trashVC
        }
        mainNavigationController.setViewControllers([targetVC], animated: true)
    }
    
}

推荐阅读