【发布时间】:2011-09-10 01:27:50
【问题描述】:
使用this 教程我设置了一个自定义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.m 的viewDidAppear 里面的人可以正常工作,并且完全符合我的期望。如果我尝试从需要像这样隐藏 TabBar 的 ViewController 调用这些方法
[customTabs hideAlsoCustomTabBar];
在initWithNibName OR viewDidLoad OR viewWillAppear 内,什么都不会发生。我检查了 NSLog,该方法被调用,但是当我读出任何按钮 .hidden 属性的 BOOL 时,它返回 0,而它应该是 1(对于 hidden==YES)。
我不知道我的设置有什么问题。默认情况下这些按钮的属性是否可能是私有的,因为CustomTabBar 继承自UITabBarController 而我无法设置它们?还是我在通话中犯了错误?
谢谢! 编辑 教程中描述的 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];
}
编辑
如下所述,我在使用 IB 生成的 Tabbar 中有 4 个选项卡,添加了带有 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。
希望这有助于理解我 :) 如果您需要任何其他信息,请告诉我。 谢谢!
【问题讨论】:
-
你确定你能正常工作吗?你声明一个像
-(void) hideAlsoCustomTabBar;这样的方法并实现- (void) hideAlsoCustomTabBar:(int)wert {。这应该导致错误。 -
@Deepak 抱歉,:(int) wert 只是为了在我的代码中进行测试,我不需要它,我会编辑我的条目以适应它!
-
customTabs是如何设置的? -
@Deepak 在调用 VC.h
IBOutlet CustomTabBar *customTabs;和@property (nonatomic, retain) IBOutlet CustomTabBar *customTabs;的内部,在 .m 内部,我合成它并如上所述使用.. 有什么遗漏吗? -
@Deepak Hm.. 我检查了
if (customTabs == nil){NSLog(@"customTabs == nil");}并将 NSLog 写入控制台。所以这就是问题所在。我错误地分配了 customTabs.. 我该怎么做呢?
标签: iphone objective-c uibutton uitabbarcontroller hide