BloodyMary 1.3.1

BloodyMary 1.3.1

TheInkedEngineer维护。



  • 作者
  • Firas Safa

BloodyMary logo

Twitter

BloodyMary

BloodyMaryTempura的一个精简版。它是一个单向MVVM框架,可以协助您编写干净代码并正确地分离职责。

BloodyMary拥有自己的自定义导航系统层,它位于Apple的原生导航系统之上,因此不会丧失任何Apple魔法。BloodyMary的导航系统可以与Apple的方式进行无缝协作。

BloodyMary的导航系统旨在帮助您用最少的代码实现应用程序的最大化效益。您向SDK提供路由标识符及其相应的视图控制器,而BloodyMary处理其余工作。从实例化正确的VC到正确地推送或展示等。show和hide函数都在一个队列上以同步方式执行。

1.3.x版本包含导航系统,目前正在用于不同的WiseEmotions 库和Telepass iOS应用程序。

路线图

  • 自定义导航系统
  • 集成Combine

1. 需求和兼容性

Swift BloodyMary iOS
5.1+ 1.0.x 10+
5.1+ 1.1.x 10+
5.1+ 1.2.x 10+
5.1+ 1.3.x 10+

2. 安装

Cocoapods

在您的Podfile中添加以下行 pod 'BloodyMary' ~> '1.3.1'

3. 文档

BloodyMary 已全面文档。查看文档 此处

4. 代码示例

单向 MVVM

struct RemindersListViewModel: BMViewModel {
  var reminders: [Models.Reminders]
  
  func shouReloadData(oldModel model: RemindersListViewModel) -> Bool {
    model.reminders.count != self.reminders.count
  }
}

class RemindersListView: BMViewWithViewControllerAndViewModel {
  [...]
  
  func update(oldModel: RemindersListViewModel?) {
    guard let model = self.viewModel else { return }
    if model.shouReloadData(oldModel: oldModel) {
      self.tableView.reloadData()
    }
  }
  
  [...]
}

class RemindersListViewController: BMViewController {
  func setupInteractions() {
    self.rootView.didTapDeleteButton = { [weak self] index in
      guard let self = self, let model = self.viewModel else { return }
      let newReminders = model.reminders.remove(at: index)
      let newViewModel = RemindersListViewModel(reminders: newReminders)
      self.update(to: newViewModel)
    }
  }
}

导航系统

为路由器提供配置

import BloodyMary

struct DependenciesContainer: RoutingConfigurationProvider {
  // prevent it from being instantiated.
  private init() {}
  
  static var shared = DependenciesContainer()
  
  var screensAndDestinations: [ScreenIdentifier : RoutableViewController.Type] {
    [
      "green": GreenViewController.self,
      "red": RedViewController.self
    ]
  }
  
  lazy var router: Router = Router(with: self)
}

安装根

import UIKit
import BloodyMary

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  
  var window: UIWindow?
  
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    
    self.window = self.window ?? UIWindow(frame: UIScreen.main.bounds)
    
    guard let window = self.window else {
      return false
    }
    
    let redVC = RedViewController()
    let redVM = RedViewModel()
    redVC.viewModel = whiteVM

    DependenciesContainer.shared.router.installRoot(using: greenViewController, in: window)

    return true
  }
}

从视图导航到另一个视图

class RedViewController: BMViewController<RedView>, Routable {
  
  func assign(model: Any) -> Bool {
    guard let model = model as? RedViewModel else {
      return false
    }
    self.viewModel = model
    return true
  }
  
  static var screenIdentifier: ScreenIdentifier {
    "red"
  }
  
  override func setupInteractions() {
    super.setupInteractions()
    
    self.rootView.didTapButton = { _ in
      let greenRoutableObject = RoutableObject(
        screenIdentifier: GreenViewController.screenIdentifier,
        viewModel: GreenViewModel(),
        navigationStyle: .modal(),
        animated: false
      )
      
      DependenciesContainer.shared.router.show(
        routableElements: greenRoutableObject, completion: nil)
    }
  }
}

5. 贡献

正在处理你的第一个拉取请求吗? 你可以从这个免费系列中学到相关知识 如何在GitHub上向开源项目贡献

生生成项目

要本地生成此项目,你需要xcodegen。这是一个出色的工具,用于自定义项目并快速生成。

你可以按照它们的步骤手动安装,或者只需运行我的setup.sh脚本。如果找不到,它会自动安装Homebrew,安装xcodegen,删除现有的(如果有),运行xcodegen并将配置文件移动到正确位置。