2011-01-10 7 views
7

두 개의 탭이있는 UITabBarController를 설정했습니다. 하나는 간단한 UIViewController이고 다른 하나는 두 번째 UIViewController를 rootController로 사용하는 UINavigationController입니다 (나중에 UITableView를 설정하는 데 사용됩니다). 제 질문은 탭의 이름 지정 (즉, 각 UITabBarItem의 제목 설정)에 관한 것입니다.UINavigationController에서 UITabBarItem 제목을 설정 하시겠습니까?

첫 번째 탭 (간단한 UIViewController)에 대해 컨트롤러 - 초기화 메소드에 다음을 추가했습니다.

// FROM -[MapController init] 
- (id)init { 
    self = [super init]; 
    if(self) { 
     UITabBarItem *tabBarItem = [self tabBarItem]; 
     [tabBarItem setTitle:@"ONE"]; 
    } 
    return self; 
} 

다른 탭에 대해서는 두 번째 컨트롤러 init (rootController)에 추가했습니다 (아래 참조).

// FROM -[TableController init] 
- (id)init { 
    self = [super init]; 
    if(self) { 
     UITabBarItem *tabBarItem = [[self navigationController] tabBarItem]; 
     [tabBarItem setTitle:@"TWO"]; 
    } 
    return self; 
} 

내가 첫 번째 탭은 "ONE은"두 번째는 비어라는 응용 프로그램을 실행할 때와 같은 현재는, 표시되지 올바른 장소에 두 번째 tabBarItem 제목을 설정하고있다. 또한 tabBarItem (위)은 값을 출력하거나 디버거를 통해 볼 때 nil을 표시합니다.

EDIT_001 : 내가 처음 UITabBarController가에 추가하기위한 준비 컨트롤러를 만들 때 AppDelegate에

에서 추가 된 전체 코드는 내가 제대로 AppDelegate에 내에서 UITabBarItem을 설정할 수 있습니다. 그러나 저는 개인용 컨트롤러 - 깔끔함을위한 최초의 방법으로 이것을하고 싶었습니다.

// UITabBarController 
UITabBarController *tempRoot = [[UITabBarController alloc] init]; 
[self setRootController:tempRoot]; 
[tempRoot release]; 
NSMutableArray *tabBarControllers = [[NSMutableArray alloc] init]; 

// UIViewController ONE 
MapController *mapController = [[MapController alloc] init]; 
[tabBarControllers addObject:mapController]; 
[mapController release]; 

// UITableView TWO 
TableController *rootTableController = [[TableController alloc] init]; 
UINavigationController *tempNavController = [[UINavigationController alloc] initWithRootViewController:rootTableController]; 
[rootTableController release]; 
[tabBarControllers addObject:tempNavController]; 
[tempNavController release]; 

[rootController setViewControllers:tabBarControllers]; 
[tabBarControllers release]; 

[window addSubview:[rootController view]]; 
[window makeKeyAndVisible]; 

EDIT_002 : 솔루션 지금까지 애플 대리자에서 업데이트 UITabBarItems 예를 들어,

// TABLE CONTROLLER 
TableController *tableController = [[TableController alloc] init]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableController]; 
[tableController release]; 
[tabBarControllers addObject:navController]; 
UITabBarItem *tabBarItem_002 = [navController tabBarItem]; 
[tabBarItem_002 setTitle:@"TWO"]; 
[tabBarItem_002 setImage:[UIImage imageNamed:@"GT_TWO.png"]]; 
[navController release]; 

EDIT_003 : 은 UINavigationController가있는 UITabBarItem을 설정하는 방법이 또는 (가 보인다) 대리인은 그것을 할 정말 최고의 장소입니다.

답변

10

실제로 tabBarItem을 직접 만든 다음보기 컨트롤러의 tabBarItem 속성에 할당해야합니다. 귀하의 초기화에서 이것을보십시오 :

UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"TWO" 
                 image:[UIImage imageNamed:@"GT_TWO.png"] 
                  tag:0]; 
self.tabBarItem = tabBarItem; 
[tabBarItem release]; 

희망이 도움이됩니다.

+1

self.navigationController.tabBarItem = tabBarItem은 다른 솔루션을 시도하고자 할 때 유용합니다. – Rabiees

0

이 시도 -

를 헤더 파일

@interface yournavController : UIViewController<UITabBarDelegate> 

self.navigationController.tabBar.delegate=self; 
    [self.navigationController.tabBar setTitle:@"TWO"]; 

가 tableviewcontroller을 init'ing하면서

3

도움이 될 것입니다 희망 init 메소드에서, 그것은 아직 네비게이션 컨트롤러의 일부가 아닙니다. 그것이 tabbaritem 변수가 nil 인 이유입니다.

이 방법이 작동하는지 잘 모르지만 tableviewcontroller의 tabbaritem을 구성 할 수 있습니다. 약간의 운이 있으면 내비게이션 컨트롤러가이를 상속받습니다. (제목 속성과 함께 작동하는 방식)

+0

안녕하세요, Kris, 아, 아주 좋은 지적입니다. 나는 그 사실을 발견하지 못했습니다. – fuzzygoat

2

나는이 작업을 수행하기 위해 AppDelegate에서이 작업을 수행하는 도우미 메서드를 만드는 방법을 사용했습니다.뷰 컨트롤러의 아이콘과 제목을 탭 표시 줄 컨트롤러에 설정하고 한 번만 작성하면되는 로직을 중앙 집중화하는 데 도움이되었습니다.

- (void)setIconAndTitleForViewController:(UIViewController *)viewController iconName:(NSString *)iconName titleKey:(NSString *)titleKey 
{ 
    NSString *iconPath = [[NSBundle mainBundle] pathForResource:iconName ofType:@"png"]; 
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:iconPath]; 
    viewController.tabBarItem.image = image; 
    [image release]; 
    viewController.title = NSLocalizedString(titleKey, @""); 
} 

당신은 다음 비슷한에 부를 것이다 :

UIViewController *viewController = [[UIViewController alloc] initWithNibName:@"SomeNibName" bundle:[NSBundle mainBundle]]; 
[self setIconAndTitleForViewController:viewController iconName:@"AnIcon" titleKey:@"SomeKey"]; 

는 그 다음 UITabBarController가에 UIViewControllers의 배열에 뷰 컨트롤러를 추가 할 수 있습니다.

0

Marco가 말했듯이, 항목을 설치하고 원하는대로 구성한 다음 할당해야합니다. 사실 그것은 애플의 문서에 있어요 :)

0

나는 정확히 같은 문제가있어서 당신의 질문이 꽤 도움이 허용 대답을 발견했다. 내가 그들의 제목 만 지역화의 모든에 사용되는 키 문자열이 아닌 탭 표시 줄 항목의 제목을 설정 한

  1. 스토리 보드 내에서 (또는 IB는 탭 표시 줄 관리) : 그러나, 나는 다음과 같은 솔루션에 온 "Localizable.strings"파일. 필자의 경우 이것은 해당 독일어 텍스트입니다. 다른 많은 경우 이것은 영어 또는 심지어 어떤 형태의 고유 키일 것입니다. didFinishLaunchingWithOptions 내 응용 프로그램 delegat Witin
  2. 나는 추가 :

for (UIViewController *vc in self.window.rootViewController.childViewController) { vc.tabBarItem.title = NSLocalizedString(vc.tabBarItem.title, @"Tab Bar Title"); }

을이 시점에서, 탭 표시 줄이 모든 (맨 위) 뷰 컨트롤러가 완전히 초기화 만 뷰 컨트롤러되어 완전히로드 첫 번째 탭의 탭이 완전히로드되었습니다. 당신이 시도한 것처럼 viewDidLoad에있는 것은 무엇이든 먼저 시도했지만 상당히 도움이되지 않습니다. init 메소드에서 제목을 설정하는 것은 스토리 보드에서 값을 덮어 쓰기 때문에 유용하지 않습니다. 이제는 TabBarItems가 너무 전문적이지 않을 수도있는 키가 있습니다. 그러나이 시점에서 현지화 된 동등 물로 변환하면 트릭을 수행합니다.

관련 문제