0

我正在使用情节提要实现 IOS6 应用程序。我希望每个屏幕——对不起,场景——让应用程序在顶部有一个视图,其中包含不同大小的不同图像按钮。点击按钮将用户带到应用程序的不同场景。

据我所知,这对于 UITabController 来说太复杂了。我尝试为该视图制作一个单独的视图控制器,并在每个场景中包含该视图,但视图中的任何功能(例如按钮)都会导致应用程序崩溃。

看起来我可能必须在一个场景中的情节提要中实现这个视图,然后将其复制并粘贴到每个其他场景中,将每个场景的转场连接到每个其他场景。多么可怕的维护噩梦!有没有更好的办法?

4

1 回答 1

1

由于您正在尝试创建自定义 UITabBarController,因此您应该使用容器视图控制器。要做到这一点:

  1. 打开你的故事板并添加一个自定义 UIVIewController(我们称之为 ContainerViewController)。
  2. 将代表您的选项卡的 UIVIews 插入该控制器,然后插入另一个 UIVIew(下面代码中的 *currentView),它将占据屏幕的其余部分。这就是子控制器将用来显示他们的场景的内容。
  3. 像往常一样为您需要的每个场景(子控制器)创建一个 UIVIewController,并为每个场景提供一个唯一标识符(Identity Inspector -> Storyboard ID)

现在您必须在 ContainerViewController 中添加以下代码:

@interface ContainerViewController ()
    @property (strong, nonatomic) IBOutlet UIView *currentView; // Connect the UIView to this outlet
    @property (strong, nonatomic) UIViewController *currentViewController;
    @property (nonatomic) NSInteger index;
@end

@implementation ContainerViewController

// This is the method that will change the active view controller and the view that is shown
 - (void)changeToControllerWithIndex:(NSInteger)index
{
    if (self.index != index){
        self.index = index;
        [self setupTabForIndex:index];

        // The code below will properly remove the the child view controller that is
        // currently being shown to the user and insert the new child view controller.
        UIViewController *vc = [self setupViewControllerForIndex:index];
        [self addChildViewController:vc];
        [vc didMoveToParentViewController:self];

        if (self.currentViewController){
            [self.currentViewController willMoveToParentViewController:nil];

            [self transitionFromViewController:self.currentViewController toViewController:vc duration:0 options:UIViewAnimationOptionTransitionNone animations:^{
                [self.currentViewController.view removeFromSuperview];
                [self.currentView addSubview:vc.view];
            } completion:^(BOOL finished) {
                [self.currentViewController removeFromParentViewController];
                self.currentViewController = vc;
            }];
        } else {
            [self.currentView addSubview:vc.view];
            self.currentViewController = vc;
        }
    }
}

// This is where you instantiate each child controller and setup anything you need  on them, like delegates and public properties.
- (UIViewController *)setupViewControllerForIndex:(NSInteger)index {

    // Replace UIVIewController with your custom classes
    if (index == 0){
        UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"STORYBOARD_ID_1"];
        return child;
    } else {
        UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"STORYBOARD_ID_2"];
        return child;
    }
}

// Use this method to change anything you need on the tabs, like making the active tab a different colour
- (void)setupTabForIndex:(NSInteger)index{

}

// This will recognize taps on the tabs so the change can be done
- (IBAction)tapDetected:(UITapGestureRecognizer *)gestureRecognizer {
    [self changeToControllerWithIndex:gestureRecognizer.view.tag];
}

最后,您创建的每个代表选项卡的视图都应该有它自己的 TapGestureRecognizer 和它的标签的数字。

通过执行所有这些操作,您将拥有一个带有所需按钮的控制器(它们不必是可重复使用的),您可以在其中添加尽可能多的功能(这将使用 setupTabBarForIndex: 方法)并且您赢了不要违反 DRY。

于 2012-09-25T23:26:24.820 回答