From 5fe2bcc666ee632689fded66cca7dd523d3a2728 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Mon, 12 May 2014 22:37:40 -0700 Subject: Generalize TabBarController transients to CyteKit. --- CyteKit/TabBarController.h | 45 +++++++++++++++++ CyteKit/TabBarController.mm | 117 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 CyteKit/TabBarController.h create mode 100644 CyteKit/TabBarController.mm (limited to 'CyteKit') diff --git a/CyteKit/TabBarController.h b/CyteKit/TabBarController.h new file mode 100644 index 0000000..bd5fbb9 --- /dev/null +++ b/CyteKit/TabBarController.h @@ -0,0 +1,45 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2013 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see . +**/ +/* }}} */ + +#ifndef CyteKit_TabBarController_H +#define CyteKit_TabBarController_H + +#include +#include + +#include + +#include + +@interface UITabBarController (Cydia) +@end + +@interface CyteTabBarController : UITabBarController { + _transient UIViewController *transient_; + _H remembered_; +} + +- (UIViewController *) unselectedViewController; +- (void) setUnselectedViewController:(UIViewController *)transient; + +@end + +#endif//CyteKit_TabBarController_H diff --git a/CyteKit/TabBarController.mm b/CyteKit/TabBarController.mm new file mode 100644 index 0000000..5f94e71 --- /dev/null +++ b/CyteKit/TabBarController.mm @@ -0,0 +1,117 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2013 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see . +**/ +/* }}} */ + +#include "CyteKit/TabBarController.h" + +#include "iPhonePrivate.h" + +@implementation UITabBarController (Cydia) + +@end + +@implementation CyteTabBarController + +- (void) didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + + // presenting a UINavigationController on 2.x does not update its transitionView + // it thereby will not allow its topViewController to be unloaded by memory pressure + if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) { + UIViewController *selected([self selectedViewController]); + for (UINavigationController *controller in [self viewControllers]) + if (controller != selected) + if (UIViewController *top = [controller topViewController]) + [top unloadView]; + } +} + +- (void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { + if ([self unselectedViewController]) + [self setUnselectedViewController:nil]; + + // presenting a UINavigationController on 2.x does not update its transitionView + // if this view was unloaded, the tranitionView may currently be presenting nothing + if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) { + UINavigationController *navigation((UINavigationController *) viewController); + [navigation pushViewController:[[[UIViewController alloc] init] autorelease] animated:NO]; + [navigation popViewControllerAnimated:NO]; + } +} + +- (void) dismissModalViewControllerAnimated:(BOOL)animated { + if ([self modalViewController] == nil && [self unselectedViewController] != nil) + [self setUnselectedViewController:nil]; + else + [super dismissModalViewControllerAnimated:YES]; +} + +- (void) setUnselectedViewController:(UIViewController *)transient { + if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) { + if (transient != nil) { + [[[self viewControllers] objectAtIndex:0] pushViewController:transient animated:YES]; + [self setSelectedIndex:0]; + } return; + } + + NSMutableArray *controllers = [[[self viewControllers] mutableCopy] autorelease]; + if (transient != nil) { + UINavigationController *navigation([[[UINavigationController alloc] init] autorelease]); + [navigation setViewControllers:[NSArray arrayWithObject:transient]]; + transient = navigation; + + if (transient_ == nil) + remembered_ = [controllers objectAtIndex:0]; + transient_ = transient; + [transient_ setTabBarItem:[remembered_ tabBarItem]]; + [controllers replaceObjectAtIndex:0 withObject:transient_]; + [self setSelectedIndex:0]; + [self setViewControllers:controllers]; + [self concealTabBarSelection]; + } else if (remembered_ != nil) { + [remembered_ setTabBarItem:[transient_ tabBarItem]]; + transient_ = transient; + [controllers replaceObjectAtIndex:0 withObject:remembered_]; + remembered_ = nil; + [self setViewControllers:controllers]; + [self revealTabBarSelection]; + } +} + +- (UIViewController *) unselectedViewController { + return transient_; +} + +- (void) unloadData { + [super unloadData]; + + for (UINavigationController *controller in [self viewControllers]) + [controller unloadData]; + + if (UIViewController *selected = [self selectedViewController]) + [selected reloadData]; + + if (UIViewController *unselected = [self unselectedViewController]) { + [unselected unloadData]; + [unselected reloadData]; + } +} + +@end -- cgit v1.2.3