2011-01-11 4 views
4

Je me suis dirigé vers le tutoriel this et j'ai créé une galerie de photos pour l'iPhone. Maintenant, je veux l'ajouter à mon projet TabBar. J'ai déjà entendu dire que Three20 ne supporte pas XIB, j'ai donc changé toute la configuration de la barre d'onglets par programmation. Je pense que je ne suis pas trop loin d'une solution finale.Support TabBar de la galerie photo de l'iPhone Three20

J'ai été en mesure de faire fonctionner la galerie de photos dans un onglet mais sans fonctions (cliquez sur une image -> elle s'ouvre, etc.). Il n'y a pas de navigation en haut de la page qui vous mène à la page d'image détaillée. J'ai fait face quand je retiré de ce didFinishLaunchingWithOptions-méthode délégué app:

// Override point for customization after application launch 
TTNavigator* navigator = [TTNavigator navigator]; 
TTURLMap* map = navigator.URLMap; 
[map from:@"demo://album" toViewController: [AlbumController class]]; 

[navigator openURLAction:[TTURLAction actionWithURLPath:@"demo://album"]]; 
return YES; 

je devais l'enlever parce que sinon l'ensemble barre d'onglets n'apparaît pas. La galerie de photos utilise tout l'écran. Je ne suis pas sûr si ce n'est pas montré, ou pas chargé. J'ai également essayé:

tabbar.hidesBottomBarWhenPushed = NO; 

Mais cela n'a pas fonctionné du tout. J'ai essayé d'ajouter le code TTNavigator à loadView(), viewDidLoad() et init() dans le AlbumController lui-même sans résultat. Est-ce que quelqu'un sait où je dois mettre cela afin de le faire fonctionner?

Mon AlbumController.h:

#import <Foundation/Foundation.h> 
#import <Three20/Three20.h> 

@interface AlbumController : TTThumbsViewController { 
    // images 
    NSMutableArray *images; 

    // parser 
    NSXMLParser * rssParser; 
    NSMutableArray * stories; 
    NSMutableDictionary * item; 
    NSString * currentElement; 
    NSMutableString * currentImage; 
    NSMutableString * currentCaption; 
} 

@property (nonatomic, retain) NSMutableArray *images; 

@end 

Et ma mise en œuvre de la didFinishLaunchingWithOptions méthode:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    // set up tab bar controller 
    tabBarController = [[UITabBarController alloc] init];   
    albumController = [[AlbumController alloc] init]; 
    firstViewController = [[FirstViewController alloc] init]; 
    secondViewController = [[SecondViewController alloc] init]; 
    firstViewController.delegateRef = self; 
    tabBarController.viewControllers = [NSArray arrayWithObjects:firstViewController, secondViewController, albumController, nil]; 
    [window addSubview:tabBarController.view];            
    [window makeKeyAndVisible]; 

    // Override point for customization after application launch 
    TTNavigator* navigator = [TTNavigator navigator]; 
    TTURLMap* map = navigator.URLMap; 
    [map from:@"demo://album" toViewController: [AlbumController class]]; 
    [navigator openURLAction:[TTURLAction actionWithURLPath:@"demo://album"]]; 
    return YES; 
} 

Merci les gars, Cheers, dooonot

Répondre

6

Ok les gars, avec l'aide de Bryan, j'ai pu faire fonctionner la galerie de photos dans une application de barre d'onglets. J'ai vu tellement de gens à la recherche de cette solution que j'essaie de l'expliquer du mieux que je peux.

Il semble qu'il n'est pas possible d'utiliser Three20 avec Interface Builder, vous devez donc configurer manuellement votre application de barre d'onglets. Ceci est mon Three20PhotoGalleryAppDelegate.h:

#import <UIKit/UIKit.h> 
#import <CoreData/CoreData.h> 
#import "AlbumController.h" 
#import "SecondViewController.h" 
#import "FirstViewController.h" 

@class TabBarAppViewController; 
@class AlbumController; 
@class SecondViewController; 
@class FirstViewController; 

@interface Three20PhotoGalleryAppDelegate : NSObject <UIApplicationDelegate> { 

    UIWindow *window; 
    UITabBarController *tabBarController; 
    AlbumController *albumController; 
    FirstViewController *firstViewController; 
    SecondViewController *secondViewController; 

@private 
    NSManagedObjectContext *managedObjectContext_; 
    NSManagedObjectModel *managedObjectModel_; 
    NSPersistentStoreCoordinator *persistentStoreCoordinator_; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) UITabBarController *tabBarController; 
@property (nonatomic, retain) AlbumController *albumController; 
@property (nonatomic, retain) SecondViewController *secondViewController; 
@property (nonatomic, retain) FirstViewController *firstViewController; 

@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; 
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; 

- (NSURL *)applicationDocumentsDirectory; 
- (void)saveContext; 

@end 

S'il vous plaît assurez-vous que vous créez un nouveau UITabBarController ainsi que tous vos ViewControllers. Continuons avec mon Three20PhotoGalleryAppDelegate.m:

#import "Three20PhotoGalleryAppDelegate.h" 
#import "AlbumController.h" 
#import "SecondViewController.h" 
#import "FirstViewController.h" 
#import <Three20/Three20.h> 

@implementation Three20PhotoGalleryAppDelegate 

@synthesize window; 
@synthesize albumController; 
@synthesize firstViewController; 
@synthesize secondViewController; 
@synthesize tabBarController; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    // set up tab bar controller manually 
    tabBarController = [[UITabBarController alloc] init];   
    albumController = [[AlbumController alloc] init]; 
    firstViewController = [[FirstViewController alloc] init]; 
    secondViewController = [[SecondViewController alloc] init]; 

    /* This is the essential part of the solution. You have to add the albumController to a 
    new navigation controller and init it as RootViewController*/ 
    UINavigationController* navController = [[[UINavigationController alloc] initWithRootViewController:albumController] autorelease]; 

    // now add all controllers to the tabBarController 
    tabBarController.viewControllers = [NSArray arrayWithObjects:firstViewController, secondViewController, navController, nil];  

    [window addSubview:tabBarController.view];            
    [window makeKeyAndVisible]; 
} 

- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)URL { 
    TTOpenURL([URL absoluteString]); 
    return YES; 
} 

- (void)dealloc { 
    [tabBarController release]; 
    [window release]; 
    [super dealloc]; 
} 

@end 

S'il vous plaît noter que vous n'avez pas besoin les trucs TTNavigator du tutoriel. Maintenant, nous devons obtenir notre galerie photo comment. Je l'ai construit dans AlbumController comme dans le tutoriel. Ceci est mon AlbumController.h:

#import <Foundation/Foundation.h> 
#import <Three20/Three20.h> 

@interface AlbumController : TTThumbsViewController { 

} 

@property (nonatomic, retain) NSMutableArray *images; 

@end 

Vous pouvez trouver la mise en œuvre du AlbumController dans le tutoriel mentionné ci-dessus. Comme le décrit la description du problème ci-dessus, ma galerie de photos utilisait toujours le plein écran. Ceci est incorrect car vous ne pouvez plus utiliser les icônes de votre barre d'onglets. Pour cela, vous devez ajouter

self.hidesBottomBarWhenPushed=NO; 

à votre méthode init() comme mentionné dans la méthode AlbumController-init ci-dessus.

Sooo, c'est à peu près tout. J'espère vraiment que quelqu'un pourra réutiliser ma solution. Merci encore à Bryan.

Vive les gars, doonot

PS: J'ai créé un projet sur GitHub. Vous pouvez télécharger l'exemple d'application here.

+0

dooonot, puis-je avoir un exemple de code de galerie de photos + tabbar? –

+0

https://github.com/doonot/TTThumbsViewController-in-a-TabBar-App – doonot

0

Essayez ceci:

tBarController = [[UITabBarController alloc] init]; 
actionController = [[ActionController alloc] initWithNibName:nil bundle:nil]; 
    // Override point for customization after application launch. 
    TTNavigator* navigator = [TTNavigator navigator]; 
TTURLMap* map = navigator.URLMap; 
[map from:@"demo://album" toViewController:tBarController]; 
[tBarController setViewControllers: 
    [NSArray arrayWithObjects:actionController,nil]]; 
[navigator openURLAction:[TTURLAction actionWithURLPath:@"demo://album"]]; 

[self.window addSubview:tBarController.view]; 
[self.window makeKeyAndVisible]; 

    return YES; 
+0

Salut Bryan, merci beaucoup pour votre réponse. J'ai essayé votre code mais j'ai seulement un écran blanc avec une barre noire en bas de la page. J'ai essayé de modifier le code mais je n'ai pas réussi à le résoudre. Une autre idée? :( – doonot

+0

J'ai reçu votre tweet sur Twitter :). Vous avez dit que AlbumController/ActionController doit être un UITabViewController. J'utilise le code pour l'AlbumController du tutoriel mentionné ci-dessus. Ce tutoriel utilise le TTThumbsViewController, parce que je veux montrer ces vignettes comme dans l'application photo. Pour afficher une -Vue « normale » sous une icône de tabulation est pas un problème du tout ... – doonot

+0

autant que je peux dire maintenant, je pense que le AlbumController est appelé correctement, mais je pense qu'il se cache la barre d'onglets en bas de la page! J'ai essayé [self.hidesBottomBarWhenPushed = NO]; et [self.wantsFullScreenLayout = NO]; mais sans succès! – doonot

0

Vous pouvez utiliser l'échantillon TTNavigatorDemo pour apprendre à l'utiliser avec les contrôleurs Tab Bar.

Questions connexes