【问题标题】:Buttons won't hide in custom TabBar按钮不会隐藏在自定义 TabBar
【发布时间】: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.mviewDidAppear 里面的人可以正常工作,并且完全符合我的期望。如果我尝试从需要像这样隐藏 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


【解决方案1】:

我已经为我的 RXCustomTabBar 教程写了一篇后续文章,应该可以回答您的问题。我认为在这里完全复制它没有任何意义。

Hiding your New Custom UITabBar (RXCustomTabBar follow up)

如果您有任何问题,请告诉我, 奥利

【讨论】:

  • 这个自定义标签栏可以正常工作,但如果您要使用 ARC,则不能用于 ARC,否则它将无法正常工作。如果您有任何建议,请提供。
【解决方案2】:

如果你想隐藏 tabBar,你可以简单地在你的视图控制器中调用

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

【讨论】:

  • @Saphrosit 感谢您的快速回复。当我有标准标签栏时,我有这个。由于我的新自定义 TabBar 基本上存在 4 个自己的按钮,只是重定向到 tabbar 功能,这条线不会做的伎俩..
  • 您的新自定义标签栏应该扩展默认的UITabBar,我认为您应该使用建议的解决方案
  • @marzapower 我很想用那行简单的代码,我试过了,但不幸的是它不会隐藏按钮:/
  • 能否请您发布您的标签栏实现代码?我的意思是你创建的自定义类。
  • @marzapower 标签栏的实现与我链接到的教程中的相同。不过,我会将代码添加到我的问题中:)
【解决方案3】:

在 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 index 中调用了 [self hideButtons]。

这将隐藏所有标签栏按钮。反之亦然,您必须设置差异条件才能显示这些选项卡按钮。

这有意义吗?

【讨论】:

  • 感谢您的回复。我理解那段代码,但我不确定你的建议是什么。 addCustomElements 在应用程序启动时被调用,但我需要在按下另一个按钮(没有标签栏按钮)后隐藏按钮,所以我需要 self.btn1.hidden = YES;等等可以从我可以调用的方法中获得..
  • @Nareille 我已经更新了我的答案。请尝试这样实现。
  • 这就像我不需要在按下 Tab 时隐藏 TabBar,但是当按下另一个在另一个视图中实现的 Button 时。所以检查tabID不是我需要的,而是能够从课堂外调用hideButtons..
【解决方案4】:

由于自定义选项卡在调用此方法时已经存在。您应该在此处将其分配给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];
}

原始答案
由于对UITabBarController 的子类的引用是nil,因此您必须正确设置它。如果您使用 IB 设置视图控制器,请转到 NIB 文件。右键单击视图控制器,选择customTabs 插座并将其连接到包含视图控制器的customTabBar 对象。

如果您以编程方式创建了视图控制器,那么在将视图控制器添加到选项卡栏之后、释放视图控制器之前的某个地方,请执行此操作,

viewController.customTabs = self.customTabBarObject;

【讨论】:

  • @Deepak 对不起,我有点困惑。我的设置就像有 4 个选项卡。点击第二个,视图显示 4 个按钮。点击其中一个按钮将打开另一个视图,我不希望在其中显示自定义 TabBar(或正常的 TabBar)。我添加了标签栏和它的标签,也就是通过 IB 使用 ViewController 的导航控制器,以编程方式声明它们并在 IB 中相应地连接 Outlets。我必须像教程中描述的那样以编程方式呈现自定义选项卡(按钮)。我将尝试发布我的问题的简化代码。这可能需要几秒钟
  • @Deepak 我编辑了我的问题,希望这是您需要知道的。我尝试了 IB 连接并为此设置了一个控制器,但它没有改变任何事情,可能是我做错了。我想我需要编程方法,但我再次不确定如何正确地做到这一点。在addCustomElementssndVC.customTabs = self.... 中调用它我不知道在self 之后添加什么。自定义按钮?似乎不起作用。我做错了什么?
  • 你说hideAlsoCustomTabBarCustomTabBar 中的一个方法,但我在更新的定义中看不到它。但是,您的 customTabs 似乎已正确连接。仅当以编程方式设置视图控制器时,第二部分才有效。所以你可以忽略self.customTabBarObject。您是否随时再次创建viewControllers
  • 好的,虽然这对我来说有点令人困惑,但我认为您是在点击按钮时创建视图控制器。由于按钮点击是在CustomTabBar 对象中处理的,因此您应该使用viewController.customTabs = self;
  • @Deepak 我没有添加hideAlsoCustomTabBar,因为它的实现如上所述,所以我认为这是不必要的。如果你说viewControllers,你说的是应该添加的那个吗?隐藏 TabBar (detailVC) 或 CustomTabBar-Controller?我在 detailVC 中创建了 CustomTabBar (customTabs) 的实例。 detailVC 更经常在整个项目中实例化。
猜你喜欢
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多