问题描述
我通过教程并创建了一张照片iPhone的画廊。现在我想将它添加到我的TabBar项目中。我已经听说过,Three20不支持XIB,所以我将整个标签栏设置改为以编程方式。我想我离最终的解决方案并不太远。
I wend through this tutorial and created a photo gallery for the iPhone. Now I want to add it to my TabBar project. I already heard, that Three20 doesn't support XIB, so I changed my whole tab bar setup to programmatically. I think I am not too far from a final solution.
我能够让照片库在一个标签中工作但没有功能(点击图片 - >打开等等)。页面顶部没有可以引导您进入详细图像页面的导航。当我从app delegate中的didFinishLaunchingWithOptions-method中删除它时,我遇到了这个问题:
I was able to get the photo gallery working in one tab but without functions (click on a pic --> it opens, etc). There is no navigation on top of the page that leads you to the detail image page. I faced this when I removed this from didFinishLaunchingWithOptions-method in app delegate:
// 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;
我必须将其删除,否则整个标签栏都不会显示。照片库使用整个屏幕。我不确定它是否未显示或未加载。我也尝试过:
I had to remove it because otherwise the whole tab bar is not shown. The photo gallery uses the whole screen. I am not sure if it is just not shown, or not loaded. I also tried:
tabbar.hidesBottomBarWhenPushed = NO;
但这根本不起作用。我试图在没有结果的情况下将TTNavigator代码添加到AlbumController本身的loadView(),viewDidLoad()和init()。有谁知道我必须把它放在哪里才能使它工作?
But that did not work at all. I tried to add the TTNavigator-code to loadView(), viewDidLoad() and init() in the AlbumController itself without a result. Does anyone know where I have to put this in order to get it working?
我的AlbumController.h:
My 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-method:
And my implementation of the didFinishLaunchingWithOptions-method:
- (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
Thanks guys, Cheers, dooonot
推荐答案
好的,在Bryan的帮助下,我能够在标签栏应用程序中运行照片库。我看到很多人在那里寻找这个解决方案,所以我试着尽可能地解释它。
Ok guys, with help of Bryan I was able to get the photo gallery running in a tab bar application. I have seen so many people out there looking for this solution so I try to explain it as good as I can.
似乎不可能使用Three20 with Interface生成器,因此您必须手动设置标签栏应用程序。这是我的Three20PhotoGalleryAppDelegate.h:
Seems like it is not possible to use Three20 with Interface Builder, so you have to set up your tab bar application manually. This is my 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:
Please make sure that you create a new UITabBarController as well as all your ViewControllers. Let's continue with my 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:
Please note that you don't need the TTNavigator stuff from the tutorial. Now we have to get our photogallery some how. I built it up in AlbumController like in the tutorial. This is my AlbumController.h:
#import <Foundation/Foundation.h>
#import <Three20/Three20.h>
@interface AlbumController : TTThumbsViewController {
}
@property (nonatomic, retain) NSMutableArray *images;
@end
您可以在教程中找到AlbumController的实现上文提到的。现在AlbumController.m:
You can find the implementation of the AlbumController in the tutorial mentioned above. Now the 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
如上面的问题描述中所述,我的照片库始终使用全屏。这很糟糕,因为您无法再使用标签栏图标了。为此,你必须添加
As described in the problem description above, my photo gallery always used the full screen. This is bad because you cannot use your tab bar icons anymore. For this you have to add
self.hidesBottomBarWhenPushed=NO;
到您的init()方法,如上面的AlbumController-init-method中所述。
to your init() method like mentioned in the AlbumController-init-method above.
Sooo,这就是它。我真的希望有人可以重复使用我的解决方案。再次感谢Bryan。
Sooo, that's pretty much it. I really hope someone can re-use my solution. Thanks again to Bryan.
干杯人,
doonot
Cheers guys,doonot
PS:我创建了一个项目在github上。您可以下载示例应用程序。
PS: I have created a project on github. You can download the sample app here.
这篇关于TabBar支持Three20 iPhone照片库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!