LPDMvvmRouterKit 0.2.8

LPDMvvmRouterKit 0.2.8

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
Released最新发布2018年1月

qiaomuhalfrostEyreFree 维护。



  • foxsofter

LPDMvvmRouterKit

codebeat badge codebeat badge

LPDMvvmRouterKit 是使用 Objective-C 编写的,在 MVVM 框架下可用。

  • 应用外部页面过渡
  • 应用内部页面过渡
  • 消息总线

中文介绍

示例

  1. 使用 git clone 命令下载仓库,Examples 目录包含所有示例程序;
  2. 使用 XCode 打开相应的项目,运行示例项目。

或者执行以下命令

git clone [email protected]:LPD-iOS/LPDMvvmRouterKit.git; 

cd LPDMvvmRouterKit/Examples; 

open 'LPDMvvmRouterKit.xcworkspace'

要求

  • XCode 7.0+
  • Swift 2.0+
  • iOS 8.0+ / macOS 10.11+ / tvOS 8.0+

安装

LPDMvvmRouterKit 通过 CocoaPods 提供。要安装它,只需在您的 Podfile 中添加以下行
然后,执行以下命令

pod "LPDMvvmRouterKit"

$ pod install

快速使用

1. 导入 LPDMvvmRouterKit

将以下代码添加到您需要使用 LPDMvvmRouterKit 的 LPDMvvmRouterKit 模块中

#import <LPDMvvmKit/LPDMvvmKit.h>
#import <LPDMvvmRouterKit/LPDMvvmRouterKit.h>
#import <LPDAdditionsKit/LPDAdditionsKit.h>

并让 viewController 继承自 LPDViewController。

2. 创建 viewModel

创建一个 viewModel。将以下头文件添加到 viewModel 的代码中

#import <LPDMvvmKit/LPDMvvmKit.h>
#import <LPDMvvmRouterKit/LPDMvvmRouterKit.h>

3. 应用外部页面过渡

通过传入 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];

4. 应用内部页面过渡

在 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)];

5. 路由消息总线

在 LPDMvvmRouterKit 库中有一个 LPDEvent 类,这个类用于实现消息总线。

  LPDEvent *event = [LPDEvent eventWithEventSelector:@"test:"];
  
  [[LPDModuleMediator sharedInstance] sendEvent:event];

在相应的 viewModel 中实现
相应的测试方法,您可以在该方法中接收此通知信息。方法后的参数必须是 id <LPDEventProtocol> 类型。

指南书

1. 应用外部页面过渡

  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>

2. 应用内部页面过渡

应用内部路由转换URL无需增加应用协议前缀,直接从模块方案开始,遵循上述规则。

在应用页面内进行页面跳转时,所有页面转换都通过navigationViewModel实现。具体实现将获取顶部NavigationController viewModel的顶部,然后调用相应的页面转换方法来实现内部路由页面转换。

支持六种转换方式

push
pop
popto
poptoroot
present
dismiss
  • 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)];

如果是popViewModel,实现原理是在viewModel中调用自身的navigation popViewModelAnimated操作。

  [self.navigation popViewModelAnimated:YES];
  • popToRootViewModel:
  [self.viewModel performSelector:@selector(popToRootViewModel)];

如果是popToRootViewModel,实现原理是在viewModel中调用自身的pop操作。

  [self.navigation popToRootViewModelAnimated:YES];

PopToRootViewModel将遍历整个ViewModel栈并找到rootViewModel进行pop。

  • 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)];

如果是dismissViewModel,实现原理是调用viewModel中的dismissNavigationViewModelAnimated操作。

  [self.navigation dismissNavigationViewModelAnimated:YES completion:nil;

3. 路由消息总线

LPDEvent旨在替代应用内的消息通知,专门用于消息总线。不用于回调,也不用于功能调用。

如果某个模块不关心某个事件,则不需要实现相应的方法。

要接收消息总线中的消息,在实现方法时需要接收一个(id)事件参数。此事件包含消息所有参数的字典、方法名称和方法是同步或异步信息。

参数描述

EventSelector:对应事件方法字符串。
EventArgs:事件传递的参数字典。
Async:这表示BOOL类型,标识事件方法是否为同步或异步。

备注

如有任何问题,期待您的反馈。

注意:如果容易使用,请给我一个“star”

作者

foxsofter,[email protected]

许可证

LPDMvvmRouterKit适用于MIT许可证。有关更多信息,请参阅LICENSE文件。