xibファイルを使用して画面間を移動する

さまざまなソースコードを読むと、xibファイルを使用して実装されたプロジェクトに出会います。 私自身は、ストーリーボードの代わりにxibを使用することを好みます(執筆目的ではなく、ストーリーボードも良いです)が、画面間のナビゲーションを勉強することはしばしば拷問に変わります。 そして、私自身の経験を共有したいと思います。







ストーリーボードがこんなに優れているのはなぜですか? まず第一に、すべてのナビゲーションを収集し、ほとんどの遷移を視覚的に表示できるという事実によって。

はい、各画面に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
      
      





したがって、画面間のナビゲーションがすぐに表示され、各画面は他の画面について何も知りません。 さらに、ブロックを使用して、ルーターに関する画面情報の必要性を排除することができました。

また、画面から画面へ問題なくデータを転送し、シングルトーンの使用を減らすこともできます。



プロジェクトへのリンク



All Articles