spectraldragon / literoute Goto Github PK
View Code? Open in Web Editor NEWLiteRoute is easy transition for your app. Written on Swift 4
License: MIT License
LiteRoute is easy transition for your app. Written on Swift 4
License: MIT License
Привет.
Почему-то при вот таком подключении pod "LightRoute" качается 2.1.19, при таком pod 'LightRoute', :git => 'https://github.com/SpectralDragon/LightRoute.git' качается 2.1.21 (то что надо). Есть очень большая необходимость в таком подключении pod 'LightRoute', чтоб выкачивалась версия 2.1.21 - без указания адреса репозитория. Можешь поправить ?
Добрый день. Такая ошибка: сейчас в блоке .then, если вернуть указатель на moduleOutput, то он присваивается источнику вызова segue.source.moduleOutput = output (класс SegueTransitionNode), что в корне не правильно, - тут нужно чтобы было так self.destination?.moduleOutput = moduleOutput, как в классе GenericTransitionNode в методе, который перегружается в SegueTransitionNode. Из-за этого в блоке then по return нельзя использовать moduleOutput, приходится его передавать через метод конфигурации модуля (через moduleInput).
Поправить это не сложно: нужно всего лишь вместо segue.source.moduleOutput = output, написать segue.destination.moduleOutput = output в методе then класса SegueTransitionNode.
Поправьте, пожалуйста.
Когда вызываешь pop функцию в LightRoute прилетает exception "Can't get pop controller in navigation controller stack." Контроллер в стеке 100% есть.
Метод такого вида:
try? transitionHandler
.forCurrentStoryboard(resterationId: nextModuleId, to: RegistrationBaseModuleInput.self)
.to(preferred: .navigationController(style: .pop))
.then { moduleInput in
moduleInput.configure(with: data.editFields)
}
UPD. moduleInput имеет другой viewController, создается второй такой модуль.
Необходимо решение с destination именно чтобы получить moduleInput.
Через метод закрытия получилось получить необходимый модуль, но без moduleInput.
try? transitionHandler.closeCurrentModule(animated: true)
.find(pop: { controller -> Bool in
return controller.restorationIdentifier == nextModuleId
})
.preferred(style: .navigationController(style: .findedPop))
.perform()
Using Xcode 9.3 the CustomTransitionNode and the TransitionNode classes are giving an error in the 'selector<Root, Type>(_ keyPath: KeyPath<Root, Type>)' method for 'self.customModuleInput = destination[keyPath: selector]'
Example:
MyModuleInput
protocol MyModuleInput: class {
func configureModule(item: ARItemInfo)
}
Presetning module router:
try self.transitionHandler!.forSegue(identifier: segueIdentifier, to: MyModuleInput.self).then({ (moduleInput) in
moduleInput.configureModule(item: item)
})
If MyModuleInput
protocol is NOT defined as class
, the .then
block will not be invoked.
I think there must be some kind of warning or a check for this case
Отличная работа, давно планирую начать делать свой проект на Viper в свободное от работы время, а это именно то что нужно, т.к наработки Rambler уже не актуальны, имхо.
Я часто использую один экран - один сторибоард благодаря этому, можно написать это:
class HomeViewController: UIViewController {
static func storyboardInstance() -> HomeViewController? {
let storyboard = UIStoryboard(name: String(describing: self), bundle: nil)
return storyboard.instantiateInitialViewController() as? HomeViewController
}
}
let homeViewController = HomeViewController.storyboardInstance()
Не знаю, подходит ли эта концепция для Viper c DI. Но я попробую объяснить свою точку зрения. В вашем примере есть такое:
private lazy var transitionModuleFactory: StoryboardFactoryProtocol = {
let factory = StoryboardFactory(storyboard: self.mainStoryboard, restorationId: self.thirdModuleID)
return factory
}()
Однако, если мне нужен переход на другой сторибоард где только один экран, то это свойство будет ненужным. Можно перенести создание фабрики прямиком в метод:
let factory = StoryboardFactory(storyboard: self.thirdStoryboard)
transitionHandler
.forStoryboard(factory: factory).....
А можно пойти дальше и расширить ваш класс добавив "стандартную" factory в метод(Знаю что подобная инициализация объекта плохой пример):
func forStoryboard<T>(storyboard:UIStoryboard, to type: T.Type) -> TransitionPromise<T> {
return forStoryboard(factory: StoryboardFactory(storyboard: storyboard), to: type)
}
func forStoryboard<T>(factory: StoryboardFactoryProtocol, to type: T.Type) -> TransitionPromise<T> {
let destination = factory.instantiateTransitionHandler
//...
Исходя из этого, можно сделать переход таким:
transitionHandler
.forStoryboard(storyboard: thirdStoryboard, to: ThirdModuleModuleInput.self)
.to(preferred: TransitionStyle.navigationController(preferredStyle: .push))
.then { moduleInput in
moduleInput.configure(with: data)
}
Это всего лишь идея улучшения функционала.
Please, upload podspec for version 2.1.20 to CocoaPods/Specs, now its 2.1.19.
how to use literoute without using storyboard?
UIViewController.children
-> UIViewController.childViewControllers
UIViewController.addChild(_:)
-> UIViewController.addChildViewController(_:)
UIViewController.didMove(toParent:)
-> UIViewController.didMove(toParentViewController:)
An example code:
try? transitionHandler
.forCurrentStoryboard(restorationId: "SplashViewController", to: SplashViewController.self)
.transition(animate: false)
.apply(to: { destination in
destination.modalPresentationStyle = .custom
})
.add(transitioningDelegate: noFlashTransitionDelegate)
.perform()
This will be always animated
В роутере есть переменная
weak var transitionHandler: TransitionHandler!
Для перехода на модуль
transitionHandler.forSegue(identifier: ...
Как сделать popViewController?
Привет!
Я делал пул реквест с обновленным закрытием модулей по аналогии с тем, что есть уже(через TransitionPromise), но в обновлении я этого не нашел. В связи с этим у меня возникла такая проблема:
Как мне сделать переход к рутовому VC в navigationController's стеке без передачи controllerId?
И почему ты все таки решил оставить старую реализацию закрытия модуля(без TransitionPromise, без конфигурирования animated как в других методах, без выбора типа закрытия)?
Привет!
У нас в проекте возникла проблема стандартного DI с помощью иницализатора и конфигуртора в рантайме приложения(необходимо было в модуле подменить интерактор при создании модуля). С этим отчасти справилась Storyboard factory(инициализацией нового контроллера в Router'е), но необходимо было дальше передать этот контроллер в LightRoute с настройками навигации/анимации/инпута.
Было придумано такое решение:
let storyboard = UIStoryboard(name: storyboardName, bundle: Bundle.main)
let factory = StoryboardFactory(storyboard: storyboard, restorationId: viewControllerId)
guard let controller = factory.instantiateTransitionHandler as? ViewController else { return }
_ = ViewControllerModuleInitializer(viewController: controller, forLogin: true)
transitionHandler
.toViewController(controller, to: ViewControllerModuleInput.self)
.to(preferred: .navigationController(preferredStyle: .push))
.then { moduleInput in
moduleInput.configure(with: "configure module input")
}
т.е. был добавлен метод toViewController<T>(_ destination: UIViewController, to type: T.Type) -> TransitionPromise<T>
в source файлы пода.
Реализация метода выглядит так:
func toViewController<T>(_ destination: UIViewController, to type: T.Type) -> TransitionPromise<T> {
let promise = TransitionPromise(root: self, destination: destination, for: type)
// Default transition action.
promise.postLintAction {
self.present(destination, animated: true, completion: nil)
}
return promise
}
На данный момент такой метод работает вполне отлично. Хотелось бы увидеть его в твоем поде. Если такое решение устраивает, то могу сделать пул реквест с изменениями. :)
Right now project doesn't have anyone tests, and new features will have problem with integrating.
My be you could help us?
Как реализовать module output при переходе?
Hi. I'm so impressed with your work its make my router part pretty neat.
I saw you already merged PR about close module and bump that part to version 1.0.8.
Do you have any plan to move cocoapod to version 1.0.8 also? because now its still 1.0.6 so for now I have to point to master branch in podfile manually.
Thanks!
In 2.1.16 you forgot remove prints from GenericTransitionNode.swift
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.