
ストーリーボードがこんなに優れているのはなぜですか? まず第一に、すべてのナビゲーションを収集し、ほとんどの遷移を視覚的に表示できるという事実によって。
はい、各画面にxibを使用すると、すべての遷移を視覚的に表示する機能が失われます(まあ、さらにいくつかの可能性があります)が、いくつかの利点があります。 ホリバーを避けるために一方と他方を使用することの長所と短所を明示的に説明することはせず、xibファイルを使用してすべてのナビゲーションを収集する方法、不要なシングルトーンの使用を取り除く方法、およびコントローラー間の接続を排除する方法のみを示します。
アプローチは非常に簡単です。 画面間の通信にはルーターオブジェクトを使用します。 ルーターをユーザーストーリーに分割します。 コールバックを使用して対話します。
実際のミニデモ
- テーブル付き画面とレコード追加ボタン
- レコード作成画面
- 詳細ビュー画面の記録
初期設定
ルーターを作成し、空白の画面を表示する
RXAppDelegate.m
#import "RXAppDelegate.h" #import "RXRouter.h" @implementation RXAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.rootViewController = [[RXRouter alloc] initRouter]; [self.window makeKeyAndVisible]; return YES; } @end
RXRouter.h
#import <UIKit/UIKit.h> @interface RXRouter : UINavigationController - (instancetype)initRouter; @end
RXRouter.m
#import "RXRouter.h" @implementation RXRouter - (instancetype)initRouter { UIViewController *rootViewController = [self createRootViewController]; self = [super initWithRootViewController:rootViewController]; if (self != nil) { self.interactivePopGestureRecognizer.enabled = NO; } return self; } - (UIViewController *)createRootViewController { UIViewController *controller = [[UIViewController alloc] init]; return controller; } @end
実装
レコードを表示するコントローラーの作成を実装します。 また、この画面を他の画面とそれらの相互作用にすぐに接続します。
RXRoute.m
#import "RXRouter.h" #import "RXNoteListViewController.h" #import "RXCreateNoteViewController.h" #import "RXDetailNoteViewController.h" @implementation RXRouter - (instancetype)initRouter { UIViewController *rootViewController = [self createRootViewController]; self = [super initWithRootViewController:rootViewController]; if (self != nil) { self.interactivePopGestureRecognizer.enabled = NO; } return self; } - (UIViewController *)createRootViewController { RXNoteListViewController *noteListController = [[RXNoteListViewController alloc] init]; __weak RXRouter *weakSelf = self; __weak RXNoteListViewController *weakNoteListController = noteListController; noteListController.createNoteBlock = ^{ RXCreateNoteViewController *createNoteViewController = [weakSelf createNoteViewController]; createNoteViewController.createNoteBlock = ^(RXNote *note){ [weakNoteListController addNote:note]; [weakSelf popViewControllerAnimated:YES]; }; [weakSelf pushViewController:createNoteViewController animated:YES]; }; noteListController.detailNoteBlock = ^(RXNote *note){ RXDetailNoteViewController *detailNoteViewController = [weakSelf createDetailNoteViewControllerWithNote:note]; [weakSelf pushViewController:detailNoteViewController animated:YES]; }; return noteListController; } - (RXCreateNoteViewController *)createNoteViewController { return [[RXCreateNoteViewController alloc] init]; } - (RXDetailNoteViewController *)createDetailNoteViewControllerWithNote:(RXNote *)note { RXDetailNoteViewController *controller = [[RXDetailNoteViewController alloc] init]; [controller showNote:note]; return controller; } @end
RXNoteListViewController.h
#import <UIKit/UIKit.h> @class RXNote; typedef void (^RXNoteListViewControllerCreateNoteBlock)(); typedef void (^RXNoteListViewControllerDetailNoteBlock)(RXNote *note); @interface RXNoteListViewController : UIViewController @property (copy, nonatomic) RXNoteListViewControllerCreateNoteBlock createNoteBlock; @property (copy, nonatomic) RXNoteListViewControllerDetailNoteBlock detailNoteBlock; - (void)addNote:(RXNote *)note; @end
RXCreateNoteViewController.h
#import <UIKit/UIKit.h> @class RXNote; typedef void (^RXCreateNoteViewControllerCreateNoteBlock)(RXNote *note); @interface RXCreateNoteViewController : UIViewController @property (copy, nonatomic) RXCreateNoteViewControllerCreateNoteBlock createNoteBlock; @end
RXDetailNoteViewController.h
#import <UIKit/UIKit.h> @class RXNote; typedef void (^RXDetailNoteViewControllerDoneBlock)(); @interface RXDetailNoteViewController : UIViewController - (void)showNote:(RXNote *)note; @end
したがって、画面間のナビゲーションがすぐに表示され、各画面は他の画面について何も知りません。 さらに、ブロックを使用して、ルーターに関する画面情報の必要性を排除することができました。
また、画面から画面へ問題なくデータを転送し、シングルトーンの使用を減らすこともできます。
プロジェクトへのリンク