我遍历this教程,并为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代码添加到AlbumController本身的loadView(),viewDidLoad()和init()中,但没有结果。有谁知道我必须把它放在哪里才能正常工作?

我的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;
}


谢谢大家,干杯,不要

最佳答案

好的,在Bryan的帮助下,我得以在标签栏应用程序中运行照片库。我看到有很多人在寻找这种解决方案,所以我会尽力解释一下。

似乎无法将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;


到上面的AlbumController-init-method中提到的init()方法。

太好了。我真的希望有人可以重用我的解决方案。再次感谢Bryan。

干杯们,
杜诺

PS:我已经在github上创建了一个项目。您可以下载示例应用程序here

10-07 20:43