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;
因此,您可以自定义此组件。