2011-01-11 7 views
4

나는 this 자습서를 통해 진행하고 iPhone 용 사진 갤러리를 만들었습니다. 이제는 TabBar 프로젝트에 추가하고 싶습니다. 이미 Three20은 XIB를 지원하지 않기 때문에 프로그래밍 방식으로 전체 탭 표시 줄 설정을 변경했습니다. 나는 내가 최종 해결책에서 너무 멀지 않다라고 생각한다.TabBar 지원 Three20 iPhone 포토 갤러리

하나의 탭에서 사진 작업을 할 수는 있지만 기능은 없습니다 (사진을 클릭하면 열림 등). 세부 이미지 페이지로 연결되는 페이지 상단에 탐색이 없습니다.

// 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 앱 대리자 didFinishLaunchingWithOptions 메소드에서이 문제를 제거 할 때 나는이에 직면했다. 사진 갤러리는 전체 화면을 사용합니다. 나는 그것이 단지 보이지 않거나, 적재되지 않으면 확실하지 않다. 나는 또한 시도했다 :

tabbar.hidesBottomBarWhenPushed = NO; 

그러나 그것은 전혀 작동하지 않았다. 결과없이 AlbumController 자체에서 loadView(), viewDidLoad() 및 init()에 TTNavigator 코드를 추가하려고했습니다. 아무도 내가 그것을 작동 시키려면 이것을 넣어야 만하는지 알고 있습니까?

내 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 메소드의 내 구현 :

답변

6

자, Bryan의 도움으로 나는 탭 갤러리 애플리케이션에서 사진 갤러리를 실행할 수있었습니다. 나는이 솔루션을 찾고있는 많은 사람들을 보았으므로 가능한 한 그것을 설명하려고 노력했다.

인터페이스 빌더와 함께 Three20을 사용할 수없는 것 같아서 탭 모음 응용 프로그램을 수동으로 설정해야합니다.

#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.h입니다. 의 내 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 

위의 문제 설명에서 설명한대로 내 사진 갤러리는 항상 전체 화면을 사용했습니다. 더 이상 탭 표시 줄 아이콘을 사용할 수 없기 때문에 좋지 않습니다. 이를 위해서는 위의 AlbumController-init-method에서 언급 한 init() 메서드에

self.hidesBottomBarWhenPushed=NO; 

을 추가해야합니다.

Sooo, 그게 전부입니다. 누군가가 내 솔루션을 다시 사용할 수 있기를 바랍니다. Bryan에게 다시 한 번 감사드립니다.

건배들, PS

doonot : 나는 GitHub의에서 프로젝트를 만들었습니다. 샘플 앱 here을 다운로드 할 수 있습니다.

+0

dooonot, 사진 갤러리 + tabbar의 샘플 코드가 있습니까? –

+0

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

0

dooonot

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

고마워, 건배,이 시도 :

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

안녕하세요, Bryan, 답변 해 주셔서 감사합니다. 귀하의 코드를 시도했지만 페이지 하단에 검정색 막대가있는 흰색 화면 만 나타납니다. 코드를 수정하려고했지만 해결할 수 없었습니다. 다른 생각? : ( – doonot

+0

나는 트위터에서 당신의 트윗을 얻었습니다. :). 당신은 AlbumController/ActionController가 UITabViewController 일 필요가 있다고 말했다. 위에서 언급 한 튜토리얼의 AlbumController 코드를 사용하고 있습니다. 이 튜토리얼에서는 TTThumbsViewController를 사용합니다. 사진 응용 프로그램 에서처럼 이러한 축소판을 표시하려고하기 때문입니다. 탭 아이콘 아래에 "일반"뷰를 표시하는 데 아무런 문제가 없습니다 ... – doonot

+0

지금까지 알 수 있듯이 AlbumController가 제대로 호출되었다고 생각하지만 탭 하단에 탭 막대가 숨겨져 있다고 생각합니다. 그 페이지! 나는 시도했다 [self.hidesBottomBarWhenPushed = NO]; 및 [self.wantsFullScreenLayout = NO]; 그러나 성공하지! – doonot

0

TTNavigatorDemo 샘플을 사용하여 탭 막대 컨트롤러와 함께 사용하는 방법을 배울 수 있습니다.