आप इसे बहुत गलत कर रहे हैं। कस्टम व्यू पदानुक्रम न बनाएं जब आप केवल डिफ़ॉल्ट का उपयोग कर सकें।
आप क्या करना चाहते हैं UITabBarController
का उप-वर्ग बनाना और एक .xib फ़ाइल भी बनाएं जिसमें आपकी कस्टम टैब बार होगी - बस एक छवि और UIButtons की मनमानी राशि (मुझे लगता है 5)। उन सभी के लिए
सेट टैग, सिर्फ 1-5 टैग, आप संभवतः यह एक कस्टम UIView
उपवर्ग के साथ कर सकता है, लेकिन वह इस परिदृश्य में अनावश्यक होगा, इसलिए यह सिर्फ प्राप्त करते समय नियंत्रण हो जाएगा टैग के साथ।
UITabBarController
का उप-वर्ग बनाएं। आपको उन सभी बटनों के संदर्भ और एक संपत्ति भी देखने की आवश्यकता होगी, यह देखने के लिए कि कौन सा बटन पिछला दबाया गया था, ताकि आप यूआई को उचित रूप से अपडेट कर सकें। विभिन्न नियंत्रण राज्यों के लिए अलग-अलग छवियों या शीर्षकों को भी असाइन करें, मैं डिफ़ॉल्ट रूप से उपयोग कर रहा हूं और इस मामले में चयनित हूं।
MYBaseTabBarController.h
@interface MYBaseTabBarController : UITabBarController
@property (strong, nonatomic) UIButton *btn1;
@property (strong, nonatomic) UIButton *btn2;
@property (strong, nonatomic) UIButton *btn3;
@property (strong, nonatomic) UIButton *btn4;
@property (strong, nonatomic) UIButton *btn5;
@property (weak, nonatomic) UIButton *lastSender;
@property (strong, nonatomic) UIView *tabBarView;
@end
MYBaseTabBarController।मीटर
सबसे पहले, दृश्य नियंत्रक (जो इस मामले में सभी UINavigationController
उपवर्गों कर रहे हैं) बनाने और उन्हें अपने UITabBarController
के viewControllers
संपत्ति के रूप में उपवर्ग के लिए आवंटित।
- (id)init {
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (void)setup {
NSMutableArray *viewControllers = [NSMutableArray array];
MYViewController1 *viewController1 = [[MYStoryboardManager storyboard1] instantiateInitialViewController];
viewController1.title = @"1";
[viewControllers addObject:viewController1];
MYViewController2 *viewController2 = [[MYStoryboardManager storyboard2] instantiateInitialViewController];
viewController2.title = @"2";
[viewControllers addObject:viewController2];
UIViewController *blankController = [UIViewController new]; // Center button, performs an action instead of leading to a controller
[viewControllers addObject:blankController];
MYViewController3 *viewController3 = [[MYStoryboardManager storyboard3] instantiateInitialViewController];
viewController3.title = @"3";
[viewControllers addObject:viewController3];
MYViewController3 *viewController4 = [[MYStoryboardManager storyboard4] instantiateInitialViewController];
viewController4.title = @"4";
[viewControllers addObject:viewController4];
self.viewControllers = viewControllers;
}
अगला हड़पने बटन आपने पहले बनाया था और -viewDidLoad
विधि में उन्हें कार्रवाइयां असाइन किया है:
- (void)viewDidLoad {
[super viewDidLoad];
_tabbarView = [[[NSBundle mainBundle] loadNibNamed:@"MyTabBar" owner:nil options:nil] lastObject]; // "MyTabBar" is the name of the .xib file
_tabbarView.frame = CGRectMake(0.0,
self.view.frame.size.height - _tabbarView.frame.size.height,
_tabbarView.frame.size.width,
_tabbarView.frame.size.height); // make it overlay your actual tab bar
[self.view addSubview:_tabbarView];
_btn1 = (UIButton *)[_tabbarView viewWithTag:1];
[_btn1 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside];
_btn2 = (UIButton *)[_tabbarView viewWithTag:2];
[_btn2 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside];
_btn3 = (UIButton *)[_tabbarView viewWithTag:3];
[_btn3 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside];
_btn4 = (UIButton *)[_tabbarView viewWithTag:4];
[_btn4 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside];
_btn5 = (UIButton *)[_tabbarView viewWithTag:5];
[_btn5 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside];
_lastSender = _btn1;
[self setSelectedViewController:self.viewControllers[0]]; // make first controller selected
}
प्रसंस्करण विधि जोड़ें:
- (void)processBtn:(UIButton *)sender {
_lastSender = sender;
[self setSelectedViewController:[self.viewControllers objectAtIndex:sender.tag - 1]];
}
और अंत में -setSelectedViewController:
ओवरराइड विधि:
- (void)setSelectedViewController:(UIViewController *)selectedViewController {
if (_lastSender != _btn3) { // check if it's not the action button
for (UIButton *btn in [_tabbarView subviews]) {
if ([btn isKindOfClass:[UIButton class]]) {
if (btn == _lastSender) {
btn.selected = YES;
}
else {
btn.selected = NO;
}
}
}
}
if ([self.viewControllers indexOfObject:selectedViewController] == 2) {
MYActionController *viewController = [[MYStoryboardManager actionStoryboard] instantiateInitialViewController];
[self presentViewController:viewController animated:YES completion:nil];
}
else {
if (self.selectedViewController == selectedViewController) {
[(UINavigationController *)self.selectedViewController popToRootViewControllerAnimated:animate]; // pop to root if tapped the same controller twice
}
[super setSelectedViewController:selectedViewController];
}
}
मुझे लगता है कि आप एआरसी सक्षम के साथ प्रोग्रामिंग कर रहे हैं और आपके पास एक कक्षा है जो आपके स्टोरीबोर्ड का प्रबंधन करती है, लेकिन यह वैसे भी सरल है।
यह चयनित उत्तर होना चाहिए क्योंकि यह पूरी तरह से काम करता है। धन्यवाद! –
इस लाइन द्वारा देखने के लिए क्या मतलब हैडिडलोड: '[self.view _tabbarView];' - एक टाइपो की तरह दिखता है। – inorganik