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