AppController 2.2.0

AppController 2.2.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2024年2月
SPM支持SPM

Christian R. Gossain维护。



  • Christian Gossain

AppController

AppController最初是受到这篇博客中描述的架构的启发:这篇博客

AppController是一个用于在iOS中管理“未认证”和“认证”界面之间过渡的轻量级控制器。许多应用程序通过在主应用程序界面之上弹出认证表单来懒散地实现这一点。这对于某些应用程序来说是不错的,但如果您正在寻找更稳健的解决方案,AppController实现的架构可以在每个认证状态之间提供干净的、明确的关注点分离。它使用苹果批准的视图控制器包含API来管理界面过渡,并在过渡完成后从内存中删除未使用的视图层次结构。

通过将您的“未认证”和“认证”视图层次结构完全分离,您可以编写更干净的代码并构建更吸引人的体验。

包含的示例项目展示了这个库的核心功能。

CI Status Version License Platform

要求

  • iOS 10.3
  • Swift 5.0

安装

AppController可以通过CocoaPods获取。要安装它,只需将以下行添加到Podfile中

pod "AppController"

使用

AppControllerInterfaceProviding

AppControllerInterfaceProviding 是一个协议,用于提供处于 未认证已认证 状态下的视图层次结构。它还提供了过渡的配置设置。

class MyAwesomeInterfaceProvider: AppControllerInterfaceProviding {

    func configuration(for appController: AppController, traitCollection: UITraitCollection) -> AppController.Configuration {
      // return a configuration model for the transition
      // note that the default configuration is being returned here, but it can be further configured
      return AppController.Configuration()
    }

    func loggedOutInterfaceViewController(for appController: AppController) -> UIViewController {
        // create and return your logged out interface view controller
        let welcomeViewController = WelcomeViewController()
        return welcomeViewController
    }

    func loggedInInterfaceViewController(for appController: AppController) -> UIViewController {
        // create and return your logged in interface view controller
        let tabBarController = UITabBarController()
        return tabBarController
    }

    func isInitiallyLoggedIn(for: AppController) -> Bool {
        // return `true` if the "logged in" interface should be initially loaded instead
        return false
    }

}

AppViewController

AppViewController 是一个自定义容器视图控制器,用于在 未认证已认证 状态之间进行过渡。

您不需要直接与这个视图控制器交互。

AppController

AppController 是管理整个过渡的对象。

您需要创建一个 AppController 实例,然后调用它的 installRootViewController(in:) 方法,并传入您的窗口对象。这将把 AppController(管理着 AppViewController)的实例安装为你的窗口对象的根视图控制器。

import UIKit
import AppController

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    let myAwesomeInterfaceProvider = MyAwesomeInterfaceProvider()

    lazy var appController: AppController = {
        let controller = AppController(interfaceProvider: self.myAwesomeInterfaceProvider)

        // do stuff just before login transition...
        controller.willLoginHandler = { [unowned self] (targetViewController) in

        }

        // do stuff right after login transition...
        controller.didLoginHandler = { [unowned self] in

        }

        // do stuff just before logout transition...
        controller.willLogoutHandler = { [unowned self] (targetViewController) in

        }

        // do stuff right after logout transition...
        controller.didLogoutHandler = { [unowned self] in

        }

        return controller
    }()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        let myWindow = UIWindow()
        window = myWindow

        // install the app controllers' root view controller as the root view controller of the window
        appController.installRootViewController(in: myWindow)

        return true
    }

}

执行过渡

过渡到 已认证 视图层次结构

AppController.login()

过渡到 未认证 视图层次结构

AppController.logout()

Storyboard 支持

如果您使用场景板文件,可以轻松配置AppController使用它。只需确保initialViewController是一个AppViewController,并在场景板文件中添加“未登录”和“已登录”接口的Storyboard ID。

import UIKit
import AppController

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    lazy var appController: AppController = {
        return AppController(storyboardName: "Main", loggedOutInterfaceID: "<Storyboad ID of `unauthenticated` view hierarchy>", loggedInInterfaceID: "<Storyboad ID of `authenticated` view hierarchy>")
    }()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // install the app controllers' root view controller as the root view controller of the window
        appController.installRootViewController(in: window!)

        return true
    }

}

作者

Christian Gossain,[email protected]

许可协议

AppController遵循MIT许可协议。有关更多信息,请参阅LICENSE文件。