2012-11-07 50 views
0

所以即時通訊設法使用UITabBar而不是UITabBarController,所以我在我的頭文件中聲明瞭UITabBar,以使它可以從我的所有方法中獲取,所以爲了使它成爲我剛剛做到的:以編程方式創建和UITabBar並檢測變化

tabBar = [[UITabBar alloc] initWithFrame:CGRectMake(0, 430, 320, 50)]; 
[self.view addSubview:tabBar]; 

,我用一個NSMutableArray加入我的對象......但在我的頭我也delcaired:

@interface RootViewController: UIViewController { 
IBOutlet UITabBar *tabBar; 
} 
@property (nonatomic, retain) UITabBar *tabBar; 
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item; 

的話,我做了一個簡單的函數來與它一起去:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { 
    NSLog(@"didSelectItem: %d", item.tag); 
} 

但是,當我進入應用程序並嘗試更改選項卡時,日誌不會返回任何內容,選定的選項卡會更改,但我的日誌無用!我已經看到這個功能設置爲通過互聯網完成這項工作,我不明白爲什麼它不適用於我的代碼。 所以任何人都可以告訴我什麼即時做錯了,這個功能不會選擇標籤更改?

+1

您忘記將您的控制器設置爲此選項卡的代表。 – hoha

+0

但重點是,我不想UITabBarController –

+0

'UITabBarController'與此無關。只有當這個對象是一個標籤欄的代表(「UITabBar」類的實例,'tabBar'字段的值)時,纔會在某個對象上調用方法'tabBar:didSelectItem:'。 'tabBar.delegate = self;'在tabBar = ...行後解決你的問題。 – hoha

回答

1

在RootViewController.h,這樣做:

@interface RootViewController : UIViewController 

@end 

在RootViewController.m,這樣做:

@interface RootViewController() <UITabBarDelegate> 
@end 

@implementation RootViewController { 
    UITabBar *tabBar; 
} 

#pragma mark UITabBarDelegate methods 

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { 
    NSLog(@"didSelectItem: %d", item.tag); 
} 

#pragma mark UIViewController methods 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    tabBar = [[UITabBar alloc] initWithFrame:CGRectMake(0, 430, 320, 50)]; 
    tabBar.delegate = self; 
    [self.view addSubview:tabBar]; 
} 

@end 

這樣的佈局需要的現代化的Objective-C的新LLVM編譯器的功能。

您不需要屬性,因爲沒有類的用戶需要訪問標籤欄。由於您沒有使用Interface Builder來設置選項卡欄,因此不需要將任何內容標記爲IBOutlet。您不要在.h文件中聲明標籤欄委託方法,因爲該類的任何客戶端都不會調用該方法。

+0

哇!非常感謝!偉大的解決方案,這是所有的avout代表,我猜吧? –

+0

是的,最終你的問題是從來沒有將標籤欄的委託設置到你的視圖控制器。其他一切只是清理,以演示利用現代Objective-C編寫代碼的好方法。 – rmaddy

+0

是啊,清理是所有的內存清理對不對? –