MvvmForIOS-Swift 0.6

MvvmForIOS-Swift 0.6

Francois Dabonot 维护。



  • Francois Dabonot

MvvmForIOS-Swift

MvvmForIOS 是一个用于在 iOS 上使用 Mvvm 模式的框架。

它完全使用 Swift 4 编写,并提供了一些用来尊重 mvvm 模式的工具。

框架内容

  • View/ViewModel/Model 结构
  • 一个用于管理 viewModel 之间导航的导航服务
  • 一个服务定位器,用于 IoC 功能

兼容性

  • Swift 4
  • iOS 8

绑定问题?

MvvmForIOS-Swift 没有绑定工具。

目前建议使用 Bond (https://github.com/DeclarativeHub/Bond)

这个框架专用于在视图和 viewModel 之间绑定内容

也可以使用 KVO,但它与 Swift 的兼容性不完全。

如何安装 MvvmForIOS-Swift

  • Carthage

github "Friend-LGA/LGSideMenuController"

github "frankois944/MvvmForIOS-Swift"

  • CocoaPods

pod 'MvvmForIOS-Swift'

如何使用它

有一个示例说明了如何在Swift项目中实施框架,而不需要绑定任何内容。

服务定位器

有一个服务定位器可以用于IoC。

//interface
protocol IDataServices : class {
    var name:String! { get }
    func openApplicationSetting() -> Bool
}

class DataServices: IDataServices {
    // ...implement protocol
}

//save
ServiceLocator.register(service: DataServices() as IDataServices)
//get
let service:IDataServices! = ServiceLocator.resolve()
let result = service.openApplicationSetting()

导航

注意

导航通过 INavigationService 进行管理。

它也基于 LGSideMenuController 框架 (https://github.com/Friend-LGA/LGSideMenuController)

所有视图之间的导航都在ViewModel中进行,这要求视图和相应的ViewModel之间有一些特定的命名。

对于ViewModel testViewModel,视图 必须命名为testView,而Storyboard名为test

如果不遵守此规则,导航将不会工作。

那么如何导航呢?

在ViewModel中只需调用

//Show
self.navigation.showViewModel(viewModelToShow: AnotherViewModel.self)
or 
self.navigation.showViewModel(viewModelToShow: AnotherViewModel.self, onCompletion:nil, withParameters:[SOMEDATA])

//Inside AnotherViewModel 
override func startViewModel(parameters: Any? [SOMEDATA]) {
        
}
//Close
self.navigation.closeViewModel(viewModelToClose: self, onCompletion: { () -> (Void) in
    NSLog("AnotherViewModel closed")
})

INavigationService 接口

INavigationService有很多导航方法,包括完成、参数等。

public protocol INavigationService {
    var navigation:LGSideMenuController { get }

    func setCenterViewModel<T:IBaseViewModel>(viewModelToShow:T.Type!) -> Void
    func setRightSideViewModel<T:IBaseViewModel>(viewModelToShow:T.Type!) -> Void
    func setLeftSideViewModel<T:IBaseViewModel>(viewModelToShow:T.Type!) -> Void
    
    func showViewModel<T:IBaseViewModel>(viewModelToShow:T.Type!) -> Void
    func showViewModel<T:IBaseViewModel>(viewModelToShow:T.Type!, onCompletion:(() -> (Void))?) -> Void
    func showViewModel<T:IBaseViewModel>(viewModelToShow:T.Type!, onCompletion:(() -> (Void))?, withParameters:AnyObject?) -> Void
    
    func showModalViewModel<T:IBaseViewModel>(viewModelToShow:T.Type!) -> Void
    func showModalViewModel<T:IBaseViewModel>(viewModelToShow:T.Type!, onCompletion:(() -> (Void))?) -> Void
    func showModalViewModel<T:IBaseViewModel>(viewModelToShow:T.Type!, onCompletion:(() -> (Void))?, customizeModal:((UIViewController) -> (Void))?) -> Void
    func showModalViewModel<T:IBaseViewModel>(viewModelToShow:T.Type!, onCompletion:(() -> (Void))?, customizeModal:((UIViewController) -> (Void))?, withParameters:AnyObject?) -> Void
    
    func closeViewModel<T:IBaseViewModel>(viewModelToClose:T!, onCompletion:(() -> (Void))?) -> Void
    func closeViewModel<T:IBaseViewModel>(viewModelToClose:T!) -> Void
    
    func showLeftPanel(animated:Bool) -> Void
    func showRightPanel(animated:Bool) -> Void
    func hideLeftPanel(animated:Bool) -> Void
    func hideRightPanel(animated:Bool) -> Void
    
    func resolveViewModel<T:IBaseViewModel>(viewModelToGet:T.Type!) -> T!
}

侧边栏

  • 本框架基于 LGSideMenuController,使用面板很方便
//in the appDelegate, set root view for Panel
navigation.setCenterViewModel(viewModelToShow: FirstViewModel.self)
navigation.setLeftSideViewModel(viewModelToShow: SecondViewModel.self)
navigation.setRightSideViewModel(viewModelToShow: SecondViewModel.self)

//in a viewModel
//show
navigation.showLeftPanel(animated: true)
navigation.showRightPanel(animated: true)
//hide
navigation.hideLeftPanel(animated: true)
navigation.hideRightPanel(animated: true)
  • 您还可以在一个侧边栏内部推送一个viewModel
the view declaration must have 
class SecondView: BaseView<SecondViewModel>, ILeftPanelAttribute /*mandatory*/ {
//implementation
}
navigation.showViewModel(viewModelToShow: SecondViewModel.self)
  • 您可以使用以下方式访问 LGSideMenuController
let lgSideCtr = navigation.navigation;

因此,您可以自定义此组件。