测试已测试 | ✗ |
Lang语言 | Obj-CObjective C |
许可证 | MIT |
Released最新发布 | 2018年1月 |
由 qiaomu,halfrost,EyreFree 维护。
LPDMvvmRouterKit 是使用 Objective-C 编写的,在 MVVM 框架下可用。
git clone
命令下载仓库,Examples
目录包含所有示例程序;或者执行以下命令
git clone [email protected]:LPD-iOS/LPDMvvmRouterKit.git;
cd LPDMvvmRouterKit/Examples;
open 'LPDMvvmRouterKit.xcworkspace'
LPDMvvmRouterKit 通过 CocoaPods 提供。要安装它,只需在您的 Podfile 中添加以下行
然后,执行以下命令
pod "LPDMvvmRouterKit"
$ pod install
将以下代码添加到您需要使用 LPDMvvmRouterKit 的 LPDMvvmRouterKit 模块中
#import <LPDMvvmKit/LPDMvvmKit.h>
#import <LPDMvvmRouterKit/LPDMvvmRouterKit.h>
#import <LPDAdditionsKit/LPDAdditionsKit.h>
并让 viewController 继承自 LPDViewController。
创建一个 viewModel。将以下头文件添加到 viewModel 的代码中
#import <LPDMvvmKit/LPDMvvmKit.h>
#import <LPDMvvmRouterKit/LPDMvvmRouterKit.h>
通过传入 URL,如果规则适用,可以过渡到应用内的对应页面。
NSURL *url = [NSURL URLWithString:@"me.ele.lpd://lpd/some/push?title=Some&x=11111.11&count=3&str=fwljfwljfwl"];
[[LPDMvvmRouter sharedInstance] openURL:url options:nil];
在 MVVM 框架中,我们只允许 viewModel 过渡,因此页面过渡只会以 pushViewModel 和 presentViewModel 两种方式实现。
pushViewModel
[[LPDMvvmRouter sharedInstance] performActionWithUrl:[LPDRouteURL routerURLWithString:@"lpd://some/push?title=Some&x=11111.11&count=3&str=fwljfwljfwl"] completion:^(id _Nullable x) {
}];
popViewModel
[self.viewModel performSelector:@selector(popViewModel)];
popToRootViewModel
[self.viewModel performSelector:@selector(popToRootViewModel)];
presentViewModel
[[LPDMvvmRouter sharedInstance] performActionWithUrl:[LPDRouteURL routerURLWithString:@"lpd://some/present?title=PresentSome&x=11111.11&count=3&str=fwljfwljfwl"] completion:^(id _Nullable x) {
}];
dismissViewModel
[self.viewModel performSelector:@selector(dismissViewModel)];
在 LPDMvvmRouterKit 库中有一个 LPDEvent 类,这个类用于实现消息总线。
LPDEvent *event = [LPDEvent eventWithEventSelector:@"test:"];
[[LPDModuleMediator sharedInstance] sendEvent:event];
在相应的 viewModel 中实现
相应的测试方法,您可以在该方法中接收此通知信息。方法后的参数必须是 id <LPDEventProtocol>
类型。
NSURL *url = [NSURL URLWithString:@"me.ele.lpd://lpd/some/push?title=Some&x=11111.11&count=3&str=fwljfwljfwl"];
[[LPDMvvmRouter sharedInstance] openURL:url options:nil];
通过传递 URL 字符串,您可以从外部应用程序过渡到应用程序内部对应的页面。
URL 字符串规则
应用 scheme://模块 scheme/viewModelName/推送(展示)?
路由将首先验证 App scheme 是否可以匹配,如果能,然后验证模块 scheme 是否匹配,如果能找到相应的 viewModel,则推送或展示。
ViewModelName(视图模型名称):这是从 viewModel 中移除前缀 LPD、移除后缀 viewModel 后的剩余名称。例如一个名为 LPDSomeViewModel 的 viewModel,则这里的 viewModelName 是 some。
参数类型的选项是 NSDictionary<UIApplicationOpenURLOptionsKey,id>
应用内部路由转换URL无需增加应用协议前缀,直接从模块方案开始,遵循上述规则。
在应用页面内进行页面跳转时,所有页面转换都通过navigationViewModel实现。具体实现将获取顶部NavigationController viewModel的顶部,然后调用相应的页面转换方法来实现内部路由页面转换。
支持六种转换方式
push
pop
popto
poptoroot
present
dismiss
[[LPDMvvmRouter sharedInstance] performActionWithUrl:[LPDRouteURL routerURLWithString:@"lpd://some/push?title=Some&x=11111.11&count=3&str=fwljfwljfwl"] completion:^(id _Nullable x) {
}];
[self.viewModel performSelector:@selector(popViewModel)];
如果是popViewModel,实现原理是在viewModel中调用自身的navigation popViewModelAnimated操作。
[self.navigation popViewModelAnimated:YES];
[self.viewModel performSelector:@selector(popToRootViewModel)];
如果是popToRootViewModel,实现原理是在viewModel中调用自身的pop操作。
[self.navigation popToRootViewModelAnimated:YES];
PopToRootViewModel将遍历整个ViewModel栈并找到rootViewModel进行pop。
[[LPDMvvmRouter sharedInstance] performActionWithUrl:[LPDRouteURL routerURLWithString:@"lpd://some/present?title=PresentSome&x=11111.11&count=3&str=fwljfwljfwl"] completion:^(id _Nullable x) {
}];
呈现和推送原理相同,此处不再赘述。
[self.viewModel performSelector:@selector(dismissViewModel)];
如果是dismissViewModel,实现原理是调用viewModel中的dismissNavigationViewModelAnimated操作。
[self.navigation dismissNavigationViewModelAnimated:YES completion:nil;
LPDEvent旨在替代应用内的消息通知,专门用于消息总线。不用于回调,也不用于功能调用。
如果某个模块不关心某个事件,则不需要实现相应的方法。
要接收消息总线中的消息,在实现方法时需要接收一个(id)事件参数。此事件包含消息所有参数的字典、方法名称和方法是同步或异步信息。
EventSelector:对应事件方法字符串。
EventArgs:事件传递的参数字典。
Async:这表示BOOL类型,标识事件方法是否为同步或异步。
如有任何问题,期待您的反馈。
注意:如果容易使用,请给我一个“star”
foxsofter,[email protected]
LPDMvvmRouterKit适用于MIT许可证。有关更多信息,请参阅LICENSE文件。