BloodyMary
BloodyMary
是Tempura的一个精简版。它是一个单向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
并将配置文件移动到正确位置。