ios - 哪种是创建自定义标签栏 Controller 的最佳方法?

标签 ios objective-c uitabbarcontroller

我正在开发的应用程序很可能是 tabBarController 应用程序。但是我不能使用 tabBarController 因为我需要在底部有一个自定义的 tab 处理程序,我还需要项目之间的自定义空间。所以我正在创建自定义 tabBarController

我想知道最好的方法。目前我的方法是这样的(使用 storyboardiOS6):- 我在 ViewController 上使用了一个 UIToolbar将充当底部 tab 栏(CustomTabBarViewController)。我为每个选项卡使用了 ContainerViews。当用户在 toolbar 上选择一个项目时,我将显示 containerView

请告诉我我是否出错或指导最佳方法。谢谢。

最佳答案

你做的非常非常错误。如果您只能使用默认 View 层次结构,请不要创建自定义 View 层次结构。

你想要做的是创建一个 UITabBarController 的子类,并创建一个 .xib 文件,它将包含你的自定义标签栏 - 只是一个图像和任意数量的 UIButtons(我想 5 ).

enter image description here

为所有这些设置标签,只需 1-5 个标签,您可以使用自定义 UIView 子类来完成,但在这种情况下这将是多余的,因此它只是获取带标签的控件。

创建 UITabBarController 的子类。您需要引用所有这些按钮以及一个属性来查看最后按下哪个按钮,以便您可以适本地更新 UI。还为不同的控件状态分配不同的图像或标题,我在这种情况下使用默认和选择。

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.m

首先,创建 View Controller (在本例中都是 UINavigationController 的子类)并将它们作为 viewControllers 分配给 UITabBarController 的子类 属性。

- (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];
  }
}

我假设您在启用 ARC 的情况下进行编程,并且您有一个管理 Storyboard的类,但无论如何这都非常简单。

关于ios - 哪种是创建自定义标签栏 Controller 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16355709/

相关文章:

ios - AVAssetWriter 输入问题 : MPEG4

iphone - 根据 iOS 版本有条件地包含 header

ios - 如何在 iOS 7 中更改 UITabBar 外观

ios - 如何自定义单个标签栏项目的外观?

iphone - 如何暂停/播放 NSTimer?

ios - PickerView无法更改第二行的颜色

iphone - iPhone中填充模型类的正确做法

objective-c - 当 NSArray 元素被释放时会发生什么?

ios - Viewcontroller 呈现问题

ios - 以编程方式/自动创建 ViewController