Added view controller getter.

This commit is contained in:
Pfeil, Scott Robert 2020-10-08 11:31:40 -04:00
parent b00201b1ab
commit 2243bbd644
4 changed files with 47 additions and 5 deletions

View File

@ -116,6 +116,9 @@
// Use this to pop to the root of the stack. If no navigation controller is provided, will use the main one in app delegate.
- (void)popToRootAnimated:(BOOL)animated navigationController:(nullable UINavigationController *)navigationController delegate:(nullable NSObject<MVMCorePresentationDelegateProtocol>*)delegate completionHandler:(nullable void (^)(void))completionBlock;
/// Returns the view controllers of the navigation controller. Takes into account navigation controller animation states.
- (nullable NSArray<UIViewController *> *)getViewControllersForNavigationController:(nullable UINavigationController *)navigationController;
#pragma mark - Presentation Simple
// Use this to present.

View File

@ -260,6 +260,27 @@
[self startNavigationWithNavigationObject:navigationObject delegate:delegate completionHandler:completionBlock];
}
- (nullable NSArray<UIViewController *> *)getViewControllersForNavigationController:(nullable UINavigationController *)navigationController {
// Check if we are currently animating.
NSInteger index = [self.navigationQueue.operations indexOfObjectPassingTest:^BOOL(__kindof MVMCoreNavigationOperation * _Nonnull operation, NSUInteger idx, BOOL * _Nonnull stop) {
if (operation.isExecuting) {
*stop = YES;
return YES;
} else {
return NO;
}
}];
if (index != NSNotFound) {
MVMCoreNavigationOperation *operation = [self.navigationQueue.operations objectAtIndex:index];
if (operation.navigationObject.navigationController == navigationController && operation.futureViewControllers) {
// Return the future state if animating.
return operation.futureViewControllers;
}
}
return navigationController.viewControllers;
}
#pragma mark - Presentation Simple
- (void)presentViewController:(nonnull UIViewController *)viewController animated:(BOOL)animated {

View File

@ -15,8 +15,12 @@
@interface MVMCoreNavigationOperation : MVMCoreOperation <UINavigationControllerDelegate>
@property (nonnull, strong, nonatomic) MVMCoreNavigationObject *navigationObject;
@property (nullable, weak, nonatomic) NSObject<MVMCorePresentationDelegateProtocol> *delegate;
/// Used to keep track of future view controller state because .viewControllers is not reliable during animation.
@property (nullable, strong, nonatomic) NSArray <UIViewController *>*futureViewControllers;
- (nullable instancetype)initWithNavigationObject:(nonnull MVMCoreNavigationObject *)navigationObject;
@end

View File

@ -17,7 +17,6 @@
@interface MVMCoreNavigationOperation ()
@property (strong, nonatomic) MVMCoreNavigationObject *navigationObject;
@property (strong, nonatomic) id animatedTransitioning;
@end
@ -95,7 +94,7 @@
switch (self.navigationObject.navigationType) {
case NavigationTypePush:
{
[self.navigationObject.navigationController pushViewController:self.navigationObject.viewController animated:self.navigationObject.animated];
[self pushViewController];
}
break;
case NavigationTypeSet:
@ -114,7 +113,7 @@
} else {
// Just push
[self.navigationObject.navigationController pushViewController:self.navigationObject.viewController animated:self.navigationObject.animated];
[self pushViewController];
}
}
break;
@ -129,13 +128,15 @@
} else {
// Just push
[self.navigationObject.navigationController pushViewController:self.navigationObject.viewController animated:self.navigationObject.animated];
[self pushViewController];
}
}
break;
case NavigationTypePop:
{
if (self.navigationObject.navigationController.viewControllers.count > 1) {
// Although the post animation state is currently fine with pop, store anyway as a precaution
self.futureViewControllers = [self.navigationObject.navigationController.viewControllers subarrayWithRange:NSMakeRange(0, self.navigationObject.navigationController.viewControllers.count - 1)];
[self.navigationObject.navigationController popViewControllerAnimated:self.navigationObject.animated];
} else {
[self markAsFinished];
@ -179,6 +180,10 @@
}
if (self.navigationObject.viewController && (self.navigationObject.viewController != self.navigationObject.navigationController.topViewController)) {
// Store post animation state.
NSInteger index = [[self.navigationObject.navigationController viewControllers] indexOfObject:self.navigationObject.viewController];
self.futureViewControllers = [self.navigationObject.navigationController.viewControllers subarrayWithRange:NSMakeRange(0, index + 1)];
[self.navigationObject.navigationController popToViewController:self.navigationObject.viewController animated:self.navigationObject.animated];
} else {
[self markAsFinished];
@ -188,6 +193,9 @@
case NavigationTypePopToRoot:
{
if (self.navigationObject.navigationController.viewControllers.count > 1) {
// Store post animation state.
self.futureViewControllers = @[self.navigationObject.navigationController.viewControllers.firstObject];
[self.navigationObject.navigationController popToRootViewControllerAnimated:self.navigationObject.animated];
} else {
[self markAsFinished];
@ -202,8 +210,14 @@
}]];
}
- (void)pushViewController {
// Although the post animation state is currently fine with push, store anyway as a precaution
self.futureViewControllers = [self.navigationObject.navigationController.viewControllers arrayByAddingObject:self.navigationObject.viewController];
[self.navigationObject.navigationController pushViewController:self.navigationObject.viewController animated:self.navigationObject.animated];
}
- (void)setViewControllers:(NSArray *)viewControllers {
self.futureViewControllers = viewControllers;
if (![self.navigationObject.navigationController.viewControllers isEqualToArray:viewControllers]) {
[self.navigationObject.navigationController setViewControllers:viewControllers animated:self.navigationObject.animated];
} else {