2011-06-07 67 views
0


使用this教程我設置了一個自定義TabBar。不幸的是,本教程不會介紹如何在不希望顯示的視圖中隱藏自定義TabBar。按鈕不會隱藏在自定義TabBar中

在我customTabBar.h我定義

- (void) hideAlsoCustomTabBar; 
- (void) showCustomTabBarAgain; 

被實現爲

- (void) hideAlsoCustomTabBar { 

    btn1.hidden = YES; 
    btn2.hidden = YES; 
    btn3.hidden = YES; 
    btn4.hidden = YES; 
} 

- (void) showCustomTabBarAgain { 

    btn1.hidden = NO; 
    btn2.hidden = NO; 
    btn3.hidden = NO; 
    btn4.hidden = NO; 
} 

調用這些內部CustomTabBar.mviewDidAppear工作正常,究竟做什麼,我希望他們做的事。如果我嘗試調用從視圖控制器的方法,我需要隱藏的TabBar這樣

[customTabs hideAlsoCustomTabBar]; 

initWithNibNameviewDidLoadviewWillAppear裏面,什麼都不會發生。我檢查了NSLog,方法被調用,但是當我讀出BOOL的任何按鈕.hidden屬性時,它返回0,當它應該是1(對於hidden==YES)。 我不知道我的設置有什麼問題。是否有可能這些按鈕的屬性默認爲私有,因爲CustomTabBar繼承自UITabBarController,我無法設置它們?或者我在通話中犯了錯誤?

謝謝! EDIT ,因爲它在教程描述使用TabBar實施

import "CustomTabBar.h" 
@implementation CustomTabBar 

@synthesize btn1,btn2,btn3,btn4; 

- (void) viewDidAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 
[self hideExistingTabBar]; 
[self addCustomElements]; 
} 

- (void) hideExistingTabBar { 
for (UIView *view in self.view.subviews) { 
    if ([view isKindOfClass:[UITabBar class]]) { 
     view.hidden = YES; 
     break; 
    } 
} 
} 

- (void) addCustomElements { 
//Initialise the two images for btnEinleitung, not selected and selected 
UIImage *btnImage = [UIImage imageNamed:@"btnEinl.png"]; 
UIImage *btnImageSelected = [UIImage imageNamed:@"btnEinl_s.png"]; 

self.btnEinleitung = [UIButton buttonWithType:UIButtonTypeCustom]; 
btnEinleitung.frame = CGRectMake(0, 430, 86, 50); 
[btnEinleitung setBackgroundImage:btnImage forState:UIControlStateNormal]; 
[btnEinleitung setBackgroundImage:btnImageSelected forState:UIControlStateSelected]; 
[btnEinleitung setTag:0]; 
[btnEinleitung setSelected:true]; 

//set other buttons 
btnImage = [UIImage imageNamed:@"btnUbg.png"]; 
btnImageSelected = [UIImage imageNamed:@"btnUbg_s.png"]; 
self.btnUebungen = [UIButton buttonWithType:UIButtonTypeCustom]; 
btnUebungen.frame = CGRectMake(86, 430, 80, 50); 
[btnUebungen setBackgroundImage:btnImage forState:UIControlStateNormal]; 
[btnUebungen setBackgroundImage:btnImageSelected forState:UIControlStateSelected]; 
[btnUebungen setTag:1]; 

    /* do the same for btn3 and btn4*/ 


//add custom buttons to view 
[self.view addSubview:btn1]; 
[self.view addSubview:btn2]; 
[self.view addSubview:btn3]; 
[self.view addSubview:btn4]; 

//setup event handlers so the buttonClicked method will respond to the touch up inside event 
[btn1 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
[btn2 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
[btn3 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
[btn4 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 

} 

//set tab to active according to the passed tag number 
- (void) selectTab:(int)tabID { 
switch (tabID) { 
    case 0: 
     [btnEinleitung setSelected:TRUE]; 
     [btnUebungen setSelected:FALSE]; 
     [btnTipps setSelected:FALSE]; 
     [btnBrauchtum setSelected:FALSE]; 

     btnEinleitung.userInteractionEnabled = NO; 
     btnUebungen.userInteractionEnabled = YES; 
     btnTipps.userInteractionEnabled = YES; 
     btnBrauchtum.userInteractionEnabled = YES; 
     break; 
    case 1: 
     [btnEinleitung setSelected:FALSE]; 
     [btnUebungen setSelected:TRUE]; 
     [btnTipps setSelected:FALSE]; 
     [btnBrauchtum setSelected:FALSE]; 

     btnEinleitung.userInteractionEnabled = YES; 
     btnUebungen.userInteractionEnabled = NO; 
     btnTipps.userInteractionEnabled = YES; 
     btnBrauchtum.userInteractionEnabled = YES; 
     break; 
// and so on for 2 and 3 
    } 
self.selectedIndex = tabID; 
} 

//get the tag of the sender/pressed button, call the function selectTab 
- (void) buttonClicked:(id)sender { 
int tagNum = [sender tag]; 
[self selectTab:tagNum]; 
} 

EDIT 如下所述,我有4個標籤中的TabBar其用IB產生,加入導航控制器,其ViewControllers,爲這些人制作Outlets並通過IB連接它們。 單擊第二個選項卡(例如sndMenuVC)將打開一個包含4個按鈕的視圖。點擊其中一個按鈕會導致另一個視圖(例如detailVC),其中我不希望顯示TabBar。 detailVC有它自己的筆尖。
開幕detailVC與按鈕的動作發生聲明如下

- (IBAction) openFourth:(id)sender{ 
detailVC *detailView = [[detailVC alloc] initWithNibName:@"detailVC" bundle:nil andSender:kFourthButtonSender]; 
[self.navigationController pushViewController:detailView animated:YES]; 
[detailView release]; 
} 

由於這是一個自定義的initWithNibName,這是我如何實現它

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andSender: (NSString *)calledByButton{ 
self.callingButton = calledByButton; 
[super initWithNibName:@"detailVC" bundle:nil]; 
return self; 
} 

所以我基本上只設置一個全局變量「callingButton」根據傳送的發送者,然後調用「正常」initWithNibName。

這一切工作正常。

如果我嘗試調用hideAlsoCustomTabBar,NSLog btn1.hidden的值從detailVC調用時返回0,但在CustomTabBar中調用時返回1,並實際隱藏按鈕。

如果需要,我將customTabs作爲IBOutlet,但不知道它是否正確連接到CustomTabBar類型的TabBarController。

IB Setup

希望這有助於理解我:)如果你需要的任何其他信息,只是讓我知道。 謝謝!

+0

你確定你得到這個工作是否正常?你聲明一個方法如' - (void)hideAlsoCustomTabBar;'並實現' - (void)hideAlsoCustomTabBar:(int)wert {'。這應該會導致錯誤。 – 2011-06-07 13:19:36

+0

@Deepak對不起,:(int)wert只是用於我的代碼中的測試目的,我不需要它,並將編輯我的條目以適應它! – Nareille 2011-06-07 15:27:32

+0

'customTabs'如何設置? – 2011-06-07 15:37:50

回答

2

我已經寫了一個跟進我的RXCustomTabBar教程應該回答你的問題。在這裏我看不出有什麼意思。

Hiding your New Custom UITabBar (RXCustomTabBar follow up)

讓我知道如果您有任何疑問, 奧利

+0

如果您要使用ARC,則此自定義標籤欄可正常工作,但不適用於ARC,而不適用於ARC。如果您有任何建議,請給予。 – 2012-11-07 12:32:41

1

,如果你想隱藏的TabBar,你可以簡單地說,在您的視圖控制器,請致電

[[[self tabBarController] tabBar] setHidden:YES]; 
+0

@Saphrosit感謝您的快速回復。當我有標準的tabbar時,我有過這個。由於我的新自定義TabBar基本上存在4個自己的按鈕,只是重定向到Tabbar功能,這條線不會做伎倆。 – Nareille 2011-06-07 13:06:06

+0

您的新自定義選項卡欄應該擴展默認的'UITabBar',您應該使用建議的解決方案,我認爲 – marzapower 2011-06-07 13:24:23

+0

@marzapower我很喜歡使用那種簡單的代碼行,我試過了,但不幸的是它不會隱藏按鈕:/ – Nareille 2011-06-07 14:32:39

0

在RXCustomTabBar.m文件addCustomElements函數被稱爲viewDidAppear。

-(void)addCustomElements 
{ 
    . 
    . 
    . 
    . 


    // Add my new buttons to the view 
    // Following lines are adding buttons to the view. Put your condition here according to requirement so that it will check and add buttons accordingly. 
    [self.view addSubview:btn1]; 
    [self.view addSubview:btn2]; 
    [self.view addSubview:btn3]; 
    [self.view addSubview:btn4]; 

    . 
    . 
    . 
    . 

} 

希望這會有所幫助。

更新

//Add following function in RXCustomTabBar.m 
-(void)hideButtons 
{ 
    btn1.hidden = YES; 
    btn2.hidden = YES; 
    btn3.hidden = YES; 
    btn4.hidden = YES; 
} 

- (void)selectTab:(int)tabID 
{ 
    switch(tabID) 
    { 
     case 0: 
      [btn1 setSelected:true]; 
      [btn2 setSelected:false]; 
      [btn3 setSelected:false]; 
      [btn4 setSelected:false]; 
      break; 
     case 1: 
      [self hideButtons]; //Call function for hiding buttons like this. 
      [btn1 setSelected:false]; 
      [btn2 setSelected:true]; 
      [btn3 setSelected:false]; 
      [btn4 setSelected:false]; 
      break; 
    } 
    self.selectedIndex = tabID; 
} 

讓說你要隱藏的第二個視圖控制器按鈕。所以我在case 1索引中調用了[self hideButtons]。

這將隱藏所有的tabbar按鈕。再次Viceversa你必須把diff條件顯示這些標籤按鈕。

這是否有意義?

+0

感謝您的回覆。我理解了這段代碼,但我不確定你的建議是什麼。 addCustomElements在應用程序啓動時被調用,但我需要在按下另一個按鈕(沒有任何一個tabbar按鈕)時隱藏按鈕,所以我需要self.btn1.hidden = YES;等等,從我可以調用的方法可用。 – Nareille 2011-06-07 14:38:48

+0

@Nareille我已經更新了我的答案。嘗試像這樣實現。 – 2011-06-08 07:13:41

+0

這就像我不需要TabBar在按下Tab時被隱藏,但是當另一個按鈕在另一個視圖中被實現時被按下。所以檢查tabID不是我所需要的,但要能夠從課堂外調用'hideButtons' .. – Nareille 2011-06-08 09:40:44

0

由於自定義選項卡已存在於調用此方法的位置。您應該將其分配到detailViewcustomTabs屬性。

- (IBAction) openFourth:(id)sender{ 
    detailVC * detailView = [[detailVC alloc] initWithNibName:@"detailVC" bundle:nil andSender:kFourthButtonSender]; 
    detailView.customTabs = **theExistingCustomTabsObject**; 
    [self.navigationController pushViewController:detailView animated:YES]; 
    [detailView release]; 
} 

一部開拓創新的回答
作爲參考UITabBarControllernil的子類,則必須正確設置它。如果您使用IB來設置視圖控制器,請轉到NIB文件。右鍵單擊視圖控制器,選擇customTabs插座並將其連接到持有視圖控制器的customTabBar對象。

如果你已經添加視圖控制器標籤欄後釋放視圖控制器之前創建的視圖控制器編程,然後某處,爲此,

viewController.customTabs = self.customTabBarObject; 
+0

@Deepak對不起,我有點困惑。我的設置就像有4個選項卡。點擊第二個,視圖顯示4個按鈕。點擊其中一個按鈕將打開另一個視圖,其中我不希望顯示自定義TabBar(或普通的)。我添加了TabBar,它的選項卡,也就是通過IB的ViewController導航控制器,以編程方式聲明它們並在IB中相應地連接出口。我不得不以編程方式呈現自定義Tabs(按鈕),如本教程中所述。我將嘗試發佈我的問題中簡化代碼。這可能需要一秒 – Nareille 2011-06-08 09:07:25

+0

@Deepak我編輯了我的問題,希望這是你需要知道的。我嘗試了IB連接並設置了一個控制器,但它沒有改變一件事,可能我做錯了。我想我需要以編程的方式,但我不知道如何做到這一點..用'sndVC.customTabs = self ....在addCustomElements'中調用它''我不知道在添加之後要添加什麼自。自定義按鈕?似乎沒有工作。我究竟做錯了什麼? – Nareille 2011-06-08 09:57:18

+0

你說'hideAlsoCustomTabBar'是'CustomTabBar'中的一個方法,但我沒有在更新的定義中看到它。但是,您的'customTabs'似乎已正確連接。只有以編程方式設置視圖控制器時,第二部分纔有效。所以你可以忽略'self.customTabBarObject'。你是否隨時創建'viewControllers'? – 2011-06-08 13:31:32