Кнопки не будут скрываться в пользовательском TabBar - PullRequest
0 голосов
/ 07 июня 2011

используя этот учебник, я настроил пользовательский 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, работает нормально и делает именно то, что я ожидаю от них.Если я попытаюсь вызвать эти методы из ViewController, где мне нужно скрыть TabBar, как это

[customTabs hideAlsoCustomTabBar];

внутри initWithNibName ИЛИ viewDidLoad ИЛИ viewWillAppear, ничего не произойдет.Я проверил с помощью NSLog, метод вызывается, но когда я считываю BOOL для любого атрибута кнопок .hidden, он возвращает 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];
}

EDIT Как описано ниже, у меня есть 4 вкладки в панели вкладок, которые были созданы с помощью IB,добавил Navigation Controller с их 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;
}

Так что я просто установил глобальную переменную "callButton "в соответствии с переданным отправителем и впоследствии вызывает" нормальное "initWithNibName.

Это все работает нормально.

Если я пытаюсь вызвать hideAlsoCustomTabBar, и NSLog значение btn1.hiddenон возвращает 0 при вызове из detailVC, но возвращает 1 при вызове из CustomTabBar и фактически скрывает кнопки.

У меня есть customTabs как IBOutlet, если необходимо, но я не знаю, правильно ли он подключен к TabBarControllerвведите CustomTabBar.

IB Setup

Надеюсь, это поможет мне понять :) Если вам нужна какая-либо другая информация, просто дайте мне знать.Спасибо!

Ответы [ 4 ]

2 голосов
/ 03 июля 2011

Я написал продолжение моего учебного пособия по RXCustomTabBar, которое должно ответить на ваши вопросы.Я не вижу смысла воспроизводить его полностью здесь.

Скрытие вашего нового пользовательского UITabBar (продолжение RXCustomTabBar)

Дайте мне знать, если у вас есть какие-либо вопросы,Oli

1 голос
/ 07 июня 2011

Если вы хотите скрыть панель вкладок, вы можете просто, в вашем контроллере представления, вызвать

[[[self tabBarController] tabBar] setHidden:YES];
0 голосов
/ 08 июня 2011

Так как пользовательские вкладки уже существуют в точке, этот метод вызывается.Вы должны присвоить его detailView customTabs свойству здесь.

- (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;
0 голосов
/ 07 июня 2011

В файле 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;
}

Допустим, вы хотите скрыть кнопки на втором контроллере вида. Поэтому я вызвал [self hideButtons] для случая 1 index.

Это позволит скрыть все кнопки панели вкладок. И снова наоборот, вы должны поставить diff условие, чтобы показать эти кнопки вкладок.

Имеет ли это смысл?

...