Хорошо, ребята, с помощью Брайана я смог запустить фотогалерею в приложении панели вкладок. Я видел так много людей, которые искали это решение, поэтому я стараюсь объяснить его как можно лучше.
Похоже, невозможно использовать 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-method.
Ооо, вот и все. Я действительно надеюсь, что кто-то может повторно использовать мое решение. Еще раз спасибо Брайану.
Ура, ребята,
doonot
PS: я создал проект на github. Вы можете скачать образец приложения здесь .