summaryrefslogtreecommitdiff
path: root/CyteKit
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2014-05-12 22:37:40 -0700
committerJay Freeman (saurik) <saurik@saurik.com>2014-05-12 22:37:40 -0700
commit5fe2bcc666ee632689fded66cca7dd523d3a2728 (patch)
tree74488b5ba23d80a7b5afabcff7ace3e82b170fe1 /CyteKit
parent93d811a2abe6e53522cb696d33717cadcefd3f69 (diff)
Generalize TabBarController transients to CyteKit.
Diffstat (limited to 'CyteKit')
-rw-r--r--CyteKit/TabBarController.h45
-rw-r--r--CyteKit/TabBarController.mm117
2 files changed, 162 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>.
+**/
+/* }}} */
+
+#ifndef CyteKit_TabBarController_H
+#define CyteKit_TabBarController_H
+
+#include <CyteKit/UCPlatform.h>
+#include <CyteKit/ViewController.h>
+
+#include <UIKit/UIKit.h>
+
+#include <Menes/ObjectHandle.h>
+
+@interface UITabBarController (Cydia)
+@end
+
+@interface CyteTabBarController : UITabBarController {
+ _transient UIViewController *transient_;
+ _H<UIViewController> 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 <http://www.gnu.org/licenses/>.
+**/
+/* }}} */
+
+#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