2011-01-11 3 views
4

Я провел через this учебник и создал фотогалерею для iPhone. Теперь я хочу добавить его в мой проект TabBar. Я уже слышал, что Three20 не поддерживает XIB, поэтому я полностью изменил настройку панели вкладок. Я думаю, что я не слишком далеко от окончательного решения.TabBar Support of Three20 iPhone Фотогалерея

Мне удалось получить фотогалерею, работающую на одной вкладке, но без функций (щелкните по рисунку -> она открывается и т. Д.). На верхней части страницы нет навигации, которая приведет вас к странице подробного изображения. Я столкнулся с этим, когда я удалил это из didFinishLaunchingWithOptions-метода в приложение делегата:

// 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; 

я должен был удалить его, потому что в противном случае вся панель вкладок не отображается. В фотогалерее используется весь экран. Я не уверен, что он просто не показан или не загружен. Я также пробовал:

tabbar.hidesBottomBarWhenPushed = NO; 

Но это не сработало. Я попытался добавить TTNavigator-код для loadView(), viewDidLoad() и init() в сам AlbumController без какого-либо результата. Кто-нибудь знает, где я должен это сделать, чтобы заставить его работать?

Мои 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 

И моя реализация didFinishLaunchingWithOptions-метода:

- (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; 
} 

Спасибо, ребята, ура, dooonot

ответ

6

Хорошо, ребята, с помощью Брайана мне удалось получить фотогалерею, запущенную в приложении панели вкладок. Я видел так много людей, ищущих это решение, поэтому я стараюсь объяснить это как можно лучше.

Похоже, что использовать Three20 с Interface Builder невозможно, поэтому вам нужно настроить приложение панели вкладок вручную. Это мой 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 

Пожалуйста, убедитесь, что вы создаете новый UITabBarController, а также все ваши ViewControllers. Давайте продолжим с моим 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 

Пожалуйста, обратите внимание, что вам не нужен TTNavigator материал из учебника. Теперь нам нужно как-то получить нашу фотогалерею. Я создал его в AlbumController, как в учебнике. Это мой AlbumController.h:

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

@interface AlbumController : TTThumbsViewController { 

} 

@property (nonatomic, retain) NSMutableArray *images; 

@end 

Вы можете найти реализацию AlbumController в учебнике упоминался выше. Теперь AlbumController.m:

#import "AlbumController.h" 
#import "PhotoSource.h" 
#import "Photo.h" 

@implementation AlbumController 
@synthesize images; 

- (id)init 
{ 
    if (self = [super init]) 
    { 
     // Initialization code 
     self.title = @"Photo Gallery"; 
     self.hidesBottomBarWhenPushed=NO; 
    } 
    return self; 
} 


- (void)viewDidLoad { 

    [self createPhotos]; // method to set up the photos array 
    self.photoSource = [[PhotoSource alloc] 
         initWithType:PhotoSourceNormal 
         title:@"All in Vain" 
         photos:images 
         photos2:nil]; 
} 

-(void)createPhotos { 
    // your independent implementation 
} 

@end 

Как описано в описании выше проблемы, моя фотогалерея всегда полный экран. Это плохо, потому что вы больше не можете использовать значки на панели вкладок. Для этого нужно добавить

self.hidesBottomBarWhenPushed=NO; 

в ваш метод инициализации(), как упомянуто в AlbumController-Init-описанным выше способом.

Sooo, это в значительной степени. Я действительно надеюсь, что кто-то сможет повторно использовать мое решение. Еще раз спасибо Брайану.

Приветствия ребята, doonot

PS: Я создал проект на GitHub. Вы можете скачать пример приложения here.

+0

dooonot, могу ли я взять пример кода фотогалереи + вкладка? –

+0

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

0

Попробуйте:

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

Привет, Брайан, большое спасибо за ваш ответ. Я пробовал свой код, но у меня только белый экран с черным полоском внизу страницы. Я попытался изменить код, но я не смог его решить. Любая другая идея? :( – doonot

+0

Я получил твит в Twitter :). Вы сказали, что AlbumController/ActionController должен быть UITabViewController. Я использую код для AlbumController из упомянутого выше учебника. В этом руководстве используется TTThumbsViewController, потому что я хочу показать эти миниатюры, как в приложении для фотографий. Чтобы показать «обычный» -Просмотр под иконкой вкладки, не проблема вообще ... – doonot

+0

Насколько я могу сказать сейчас, я думаю, что AlbumController вызван правильно, но я думаю, что он скрывает панель вкладок внизу страница! Я попробовал [self.hidesBottomBarWhenPushed = NO]; и [self.wantsFullScreenLayout = NO]; но безуспешно! – doonot

0

Вы можете использовать образец TTNavigatorDemo, чтобы узнать, как использовать его с контроллерами панели вкладок.

Смежные вопросы