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