0

ストーリーボードを使用してIOS6アプリを実装しています。アプリのすべての画面(すみません、シーン)に、さまざまなサイズのさまざまな画像ボタンを含むビューを上部に表示したいと思います。ボタンをタップすると、ユーザーはアプリのさまざまなシーンに移動します。

私の知る限り、これはUITabControllerには複雑すぎます。そのビュー用に個別のビューコントローラーを作成し、各シーンにビューを含めようとしましたが、ボタンなどのビューの機能によってアプリがクラッシュします。

このビューを1つのシーンのストーリーボードに実装し、それをコピーして他のすべてのシーンに貼り付け、すべてのシーンから他のすべてのシーンにセグエを接続する必要があるようです。なんてメンテナンスの悪夢でしょう。もっと良い方法はありますか?

4

1 に答える 1

1

カスタム UITabBarController を作成しようとしているので、コンテナ ビュー コントローラを使用する必要があります。それを行うには:

  1. ストーリーボードを開き、カスタム UIVIewController (ContainerViewController と呼びましょう) を追加します。
  2. タブを表す UIVIew をそのコントローラーに挿入してから、画面の残りの部分を占める別の 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 に答える