2011-01-10 25 views
7

Tôi đã thiết lập một UITabBarController với hai tab, một là một UIViewController đơn giản và khác là một UINavigationController sử dụng một UIViewController thứ hai như rootController của nó (sau này sẽ được sử dụng để thiết lập một UITableView). Câu hỏi của tôi là liên quan với để đặt tên cho các tab (ví dụ: thiết lập các tiêu đề của mỗi UITabBarItem)Đặt tiêu đề UITabBarItem từ UINavigationController?

Đối với tab đầu tiên (UIViewController đơn giản) Tôi đã thêm như sau (xem bên dưới) sang điều khiển init phương pháp.

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

Đối với tab khác tôi đã thêm (xem bên dưới) vào bộ điều khiển thứ hai init (rootController).

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

Tôi thiết lập các tiêu đề tabBarItem thứ hai ở đúng nơi như hiện nay nó không hiển thị, khi tôi chạy ứng dụng tab đầu tiên nói "ONE" thứ hai là trống. Ngoài ra tabBarItem (ở trên) cho thấy nil khi tôi in giá trị hoặc xem qua trình gỡ lỗi.

EDIT_001: Nhập mã đầy đủ từ appdelegate

tôi một cách chính xác có thể thiết lập UITabBarItem từ bên trong appdelegate khi tôi lần đầu tiên tạo ra các bộ điều khiển, sẵn sàng cho thêm vào UITabBarController. Nhưng tôi thực sự muốn làm điều này trong các phương thức -init điều khiển riêng biệt cho sự gọn gàng.

// 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: Giải pháp cho đến nay, Update UITabBarItems trong ứng dụng của đại biểu ví dụ

// 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: là có một cách để thiết lập các UITabBarItem trong UINavigationController hoặc là các đại biểu (như nó có vẻ) thực sự là nơi tốt nhất để làm điều đó.

Trả lời

10

Bạn thực sự phải tự tạo tabBarItem rồi gán nó cho thuộc tính tabBarItem của trình điều khiển xem. Hãy thử điều này trong init của bạn:

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

Hy vọng điều này sẽ hữu ích.

+1

self.navigationController.tabBarItem = tabBarItem là những gì làm việc cho tôi trong trường hợp bất cứ ai muốn thử một giải pháp khác! – Rabiees

0

Hãy thử điều này -

trong file header

@interface yournavController : UIViewController<UITabBarDelegate> 

và trong phương thức init

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

hy vọng nó sẽ giúp

3

Trong khi init'ing các tableviewcontroller, nó không phải là một phần của bộ điều hướng. Đó là lý do tại sao biến tabbaritem là không.

Không chắc chắn nếu điều này làm việc, nhưng bạn có thể cấu hình tabbaritem của tableviewcontroller. Với một chút may mắn, bộ điều hướng kèm theo sẽ kế thừa nó. (đó là cách nó hoạt động với thuộc tính tiêu đề)

+0

Hi Kris, ah thats một điểm rất tốt, tôi đã không phát hiện ra điều đó. – fuzzygoat

2

Tôi đã sử dụng phương pháp trợ giúp để thực hiện việc này trong AppDelegate cho một dự án mà tôi đang thực hiện.Nó đã giúp tôi tập trung vào logic thiết lập các biểu tượng và tiêu đề cho các bộ điều khiển xem trên thanh điều khiển thanh tab và chỉ phải viết nó một lần.

- (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, @""); 
} 

Sau đó, bạn sẽ gọi nó là tương tự như:

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

Sau đó thêm bộ điều khiển nhằm mảng UIViewControllers trên UITabBarController.

0

Cũng giống như Marco nói, bạn phải instanciate mục, cấu hình nó theo ý muốn của bạn, sau đó gán nó. Trên thực tế nó có trong tài liệu của Apple :)

0

Tôi có cùng một vấn đề và tìm thấy câu hỏi của bạn một câu trả lời được chấp nhận khá hữu ích. Tuy nhiên, tôi đã đến giải pháp sau:

  1. Trong bảng phân cảnh (hoặc thanh tab được quản lý IB) Tôi đã đặt tiêu đề của thanh tab không phải tựa đề của chúng nhưng chuỗi khóa được sử dụng trong tất cả bản địa hóa Các tệp "Localizable.strings". Trong trường hợp của tôi, đây là văn bản Đức sửa đổi. Trong nhiều trường hợp khác, đây sẽ là tiếng Anh hoặc thậm chí một số khóa duy nhất của bất kỳ biểu mẫu nào.
  2. Witin delegat ứng dụng của tôi trong didFinishLaunchingWithOptions Tôi nói thêm:

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

Tại thời điểm này trong thời gian, thanh tab là nạp đầy đủ, tất cả (trên cùng) xem bộ điều khiển được khởi tạo đầy đủ nhưng chỉ có điều khiển xem của tab đầu tiên được tải đầy đủ. Bất cứ điều gì trong viewDidLoad, như bạn đã thử và như tôi đã thử đầu tiên, không phải là khá hữu ích. Đặt tiêu đề trong các phương thức init không hữu ích vì các giá trị đó được ghi đè bởi bảng câu chuyện. Bây giờ TabBarItems có các phím như tiêu đề có thể không quá chuyên nghiệp. Nhưng chuyển đổi chúng sang tương đương địa phương tại thời điểm này trong thời gian hiện các trick.

Các vấn đề liên quan