3

iPadアプリに6つのアイテムを持つタブバーコントローラーがあります。2 つのアイコンをタップすると、同じビュー コントローラーに移動します。このView Controllerには、表示されるアイテムのリストがあり、タップしたタブバーのアイコンに応じてわずかに変化します。

ストーリーボードでこれを設定するにはどうすればよいですか? リレーションシップを同じビュー コントローラーに 2 回ドラッグすることは可能ですが、タブ バーに同じアイコンが 2 つ表示されるだけです。2 つの選択肢に異なるアイコンと名前を付けたい。

4

7 に答える 7

8

おわかりのように、ビュー コントローラーはストーリーボードで 1 回デザインできますが、それをタブ バー コントローラーに複数回関連付けることはできません。

あなたができることは、ID インスペクターで識別子を割り当てることです。実行時にメソッド-[UIStoryboard instantiateViewControllerWithIdentifier:]を使用して、View Controller の 2 番目のコピーをインスタンス化できます。-[UITabBarController setViewControllers:animated:]を使用して、その 2 番目のコピーをタブ コントローラーに挿入できます。

于 2013-02-21T05:39:27.813 に答える
1

同様の問題があり、非常に簡単に解決しました。

ストーリーボードに TabBarController を作成します。

各タブで、ナビゲーション コントローラーを割り当てます。

ルート ビュー コントローラーとして設定されたすべてのナビゲーション コントローラーを、それらの間で共有する 1 つのビュー コントローラーにします。

View Controller の ViewDidLoad で、選択したタブに応じて View Controller をカスタマイズするために、tabBarController.selectedIndex に基づいて条件を作成します。このようなもの:

override func viewDidLoad() {
    super.viewDidLoad()
    if let selectedTabIndex = tabBarController?.selectedIndex {
           switch selectedTabIndex:
           case 0: // Customize ViewController for tab 1
           case 1: // Customize ViewController for tab 2
           case 2: // Customize ViewController for tab 3
           default: break

}
于 2016-07-14T11:06:57.337 に答える
1

4 つのタブ アイテムを含むタブ バー コントローラー ビューを実装しようとしていて、各タブ アイテムが同じビュー コントローラーを再利用しようとしているときに、あなたと同じ質問を受けました。これら 4 つのアイテムのカスタム ロジックは、タブ バーがコントローラー呼び出しviewDidLoad。以下のように私がやったことをお見せしましょう:

1. 4 つのビュー コントローラーを持つタブ バー コントローラーを作成する

ストーリーボードを開き、Tab Bar Controllerオブジェクト ライブラリから をドラッグします。さらにもう 2 つview controllerをストーリーボードにドラッグします。

タブ バー コントローラーと 2 つの新しいビュー コントローラーをリンクすることを忘れないでください。

2. 4 タブ ビューの再利用ビュー コントローラーを作成します。

という名前の新しい cocoa touch クラスViewControllerを作成し、@interface セクションにカスタマイズ プロパティを作成します。これらのプロパティはタブ バー コントローラーviewDidLoadメソッドで設定されるため、4 つのタブ ビューは同じビュー コントローラーを使用しますが、プロパティは同じではありません。

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

// Define your customisation properties here, so that you can set it in the tab bar controller.
@property (assign, nonatomic) UITableViewCellStyle style;

@end

4. UITabBarController のビュー コントローラー サブクラスを作成します。

という名前の新しい Cocoa Touch クラスを作成し、UITabViewControllerそれを のサブクラスにしてUITabBarController、 を準拠させUITabBarControllerDelegateます。

私の場合、4 つの異なるタブで異なる 4 セル スタイルのテーブル ビューを表示する必要があるため、タブ バー コントローラーでviewControllerのプロパティを設定して目標を達成します。style

UITabViewController.h

#import <UIKit/UIKit.h>

@interface UITabViewController : UITabBarController <UITabBarControllerDelegate>
@end

UITabViewController.m

#import "UITabViewController.h"

@interface UITabViewController ()

@end

@implementation UITabViewController

- (void)viewDidLoad {
    // Make UITabViewController as the delegate of UITabBarController
    self.delegate = self;

    [super viewDidLoad];

    // Set-Up the UITableCell style for each tab item
    [self.viewControllers enumerateObjectsUsingBlock:^(id viewController, NSUInteger idx, BOOL *stop){
        UITableViewCellStyle style;
        switch (idx) {
            case 0:
                style = UITableViewCellStyleDefault;
                break;
            case 1:
                style = UITableViewCellStyleSubtitle;
                break;
            case 2:
                style = UITableViewCellStyleValue1;
                break;
            case 3:
                style = UITableViewCellStyleValue2;
                break;
            default:
                style = UITableViewCellStyleDefault;
                break;
        }

        SEL selector = @selector(setStyle:);

        if([viewController respondsToSelector:selector]){
            NSInvocation *invk = [NSInvocation invocationWithMethodSignature:[viewController methodSignatureForSelector:selector]];
            [invk setSelector:selector];
            [invk setTarget:viewController];

            [invk setArgument:&style atIndex:2];
            [invk invoke];
        }
    }];
}

または、ユーザーが別のタブ項目を選択したときにカスタマイズ プロパティを設定する必要がある場合は、UITabViewController@implementation セクションに新しいデリゲート メソッドを追加できます。

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
    // Check whether the view controller responds to the property setter method
    SEL selector = @selector(setMyProperty:);

    if([viewController respondsToSelector:selector]){
        // Call the setter method with NSInvocation
        NSInvocation *invk = [NSInvocation invocationWithMethodSignature:[viewController methodSignatureForSelector:selector]];
        [invk setSelector:selector];
        [invk setTarget:viewController];

        [invk setArgument:&argument atIndex:2];
        [invk invoke];
    }
}
于 2015-12-21T05:09:09.410 に答える
1

特に異なるデータをロードする場合は、2 つの別個のビュー コントローラーを作成し、それらをタブ バー コントローラーに個別に配置する方がよいと思います。同じView ControllerをTab Bar Controllerに複数回配置することはできますが、設計と操作方法に関する限り、そのようにすることはあまり意味がありません.

于 2013-02-20T14:58:10.340 に答える
0

UITabBarController でやろうとしていることはできないと思います。必要に応じて、同じビュー コントローラー クラスの 2 つの異なるインスタンスを追加できます。それ以外の場合は、通常の UIViewController にタブ バーを追加し、独自のロジックを記述してコントローラーを切り替える必要があります。

于 2013-02-20T16:39:20.657 に答える