TabBar Поддержка фотогалереи iPhone Three20

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

Мне удалось заставить работать фотогалерею на одной вкладке, но без функций (нажмите на картинку -> она откроется и т. Д.). В верхней части страницы нет навигации, которая ведет к странице с подробным изображением. Я столкнулся с этим, когда удалил это из метода 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;
}

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


person nimrod    schedule 11.01.2011    source источник


Ответы (3)


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

Похоже, что использовать 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, а также все ваши ViewController. Давайте продолжим с моим 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;

к вашему методу init (), как указано выше в методе AlbumController-init.

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

Ура, ребята, дунот

PS: Я создал проект на github. Вы можете загрузить образец приложения здесь.

person nimrod    schedule 14.01.2011

Попробуй это:

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;
person Bryan    schedule 13.01.2011
comment
Привет, Брайан, большое спасибо за ответ. Я пробовал ваш код, но получаю только белый экран с черной полосой внизу страницы. Я попытался изменить код, но не смог. Есть еще идеи? :( - person nimrod; 13.01.2011
comment
Я получил твит в Твиттере :). Вы сказали, что AlbumController / ActionController должен быть UITabViewController. Я использую код для AlbumController из упомянутого выше руководства. В этом руководстве используется TTThumbsViewController, потому что я хочу показать эти эскизы, как в приложении для фотографий. Показать нормальный вид под значком вкладки вообще не проблема ... - person nimrod; 13.01.2011
comment
Насколько я могу судить сейчас, я думаю, что AlbumController вызывается правильно, но я думаю, что он скрывает панель вкладок внизу страницы! Я попробовал [self.hidesBottomBarWhenPushing = NO]; и [self.wantsFullScreenLayout = NO]; но безуспешно! - person nimrod; 14.01.2011

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

person Bruno    schedule 03.02.2011