35
Storyboards Segregation

Storyboard Segregation

Embed Size (px)

Citation preview

Page 1: Storyboard Segregation

Storyboards Segregation

Page 2: Storyboard Segregation

Зачем?

Page 3: Storyboard Segregation

Обычная storyboard

Page 4: Storyboard Segregation

Обычная storyboard

• Тесная связанность всех экранов,

• Запутанность логики переходов прямо пропорциональна количеству экранов,

• Невозможно работать совместно.

Page 5: Storyboard Segregation

Решение

Page 6: Storyboard Segregation

Метод банана

• В отдел покупается банан.

• Только разработчик, в руках которого он находится, может работать со storyboard.

• Профит.

Page 7: Storyboard Segregation

Решение получше

Page 8: Storyboard Segregation

Раздельные storyboards

1. Выделяем из карты экранов общие user stories.

2. Экстраполируем их на контроллеры Main.storyboard.

3. Переносим эти группы в отдельные storyboards.

Page 9: Storyboard Segregation

Было

Page 10: Storyboard Segregation

Стало

Page 11: Storyboard Segregation

Несколько тезисов• Группа экранов выделяется в отдельную

storyboard в двух случаях:

• Самостоятельная user story (Settings User Story),

• Общая группа экранов для нескольких storyboards (Photos User Story).

• Не нужно бояться маленьких storyboards.

Page 12: Storyboard Segregation

Storyboard-to-Storyboard

Page 13: Storyboard Segregation

Программно

Page 14: Storyboard Segregation

pushViewController:

Page 15: Storyboard Segregation

pushViewController:

Page 16: Storyboard Segregation

Segues

Page 17: Storyboard Segregation

LinkedStoryboardSegueSegue Identifier:

MSAPhotoGalleryViewController_Photos

Page 18: Storyboard Segregation

LinkedStoryboardSegue

@interface MSALinkedStoryboardSegue : UIStoryboardSegue

+ (UIViewController *)sceneNamed:(NSString *)identifier;

@end

Page 19: Storyboard Segregation

LinkedStoryboardSegue

Page 20: Storyboard Segregation

UITabBarController

Page 21: Storyboard Segregation

UITabBarController- (UITabBarController *)tabBarController { return [TyphoonDefinition withClass:[UITabBarController class] configuration:^(TyphoonDefinition *definition) { [definition injectProperty:@selector(viewControllers) with:[self storyboardsInitialViewControllers]]; }]; }

- (NSArray *)storyboardsInitialViewControllers { return @[ [[UIStoryboard storyboardWithName:MSABreedsStoryboardIdentifier bundle:[NSBundle mainBundle]] instantiateInitialViewController], [[UIStoryboard storyboardWithName:MSABestCatStoryboardIdentifier bundle:[NSBundle mainBundle]] instantiateInitialViewController], [[UIStoryboard storyboardWithName:MSASettingsStoryboardIdentifier bundle:[NSBundle mainBundle]] instantiateInitialViewController] ]; }

Page 22: Storyboard Segregation

Роутеры

Page 23: Storyboard Segregation

Зачем?

• ViewController не должен знать о реализации переходов между экранами.

• ViewController не должен конфигурировать другие ViewController’ы.

Page 24: Storyboard Segregation

Как?@interface UIViewController (Routing)

@property (nonatomic, strong) id<MSARoutingProtocol> router;

@end

@protocol MSARoutingProtocol <NSObject>

- (instancetype)initWithNavigationController:(UINavigationController *)navigationController;

- (void)dismissCurrentViewController:(UIViewController *)viewController animated:(BOOL)animated;

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;

@end

Page 25: Storyboard Segregation

А пример?@protocol MSABreedsRouter <MSARoutingProtocol>

- (void)showBreedViewControllerFromSourceController:(UIViewController *)sourceController withCatBreed:(MSACatBreed *)catBreed;

- (void)showPhotosViewControllerFromSourceController:(UIViewController *)sourceController withCatBreed:(MSACatBreed *)catBreed;

- (void)showWarningViewControllerFromSourceController:(UIViewController *)sourceController;

@end

Page 26: Storyboard Segregation

А передача данных?

1. В UIViewController+Routing: prepareForSegue -> msa_prepareForSegue

2. И методы от Ильи: - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender userInfo:(NSDictionary *)userInfo;

- (NSDictionary *)segueUserInfo:(UIStoryboardSegue *)segue;

Page 27: Storyboard Segregation

Полезные мелочи

Page 28: Storyboard Segregation

Переиспользование экранов

• Если экран входит сразу в несколько user stories, можно реализовать его отдельно.

• Storyboard сама подтягивает нужный xib по имени класса.

Page 29: Storyboard Segregation

Переиспользование экранов

Page 30: Storyboard Segregation

Storyboard Constants

• Receiver (<MSAPhotoGalleryViewController: 0x8cbd540>) has no segue with identifier ‘breedDetailSegue’

Page 31: Storyboard Segregation

Storyboard Constants

• Receiver (<MSAPhotoGalleryViewController: 0x8cbd540>) has no segue with identifier ‘breedDetailSegue’

:(

Page 32: Storyboard Segregation

Storyboard Constants

generate_constants.py -> MSAStoryboardsIdentifiers.h

/* Segue identifier constants */ @class NSString;

extern NSString * const sBreedDetailSegue; extern NSString * const sMSAPhotoGalleryViewController_Photos; extern NSString * const sMSAPhotoViewController_Photos; extern NSString * const sPhotoViewSegue; extern NSString * const sWarningSegue;

Page 33: Storyboard Segregation

Storyboard Constants

• В списке Build Phases скрипт генерации констант должен быть на первом месте.

• Можно смело выпилить генерацию констант для ID контроллеров и ячеек.

• Да и вообще, жить можно и без него.

Page 34: Storyboard Segregation

User Stories как структура

• Иногда красиво разбивать файлы проекта получается по User Stories:

Page 35: Storyboard Segregation

Полезные ссылки

• Тестовое приложение: https://github.com/igrekde/MultipleStoryboardsSample

• Reusing Views with Auto Layout: http://cocoanuts.mobi/2014/03/26/reusable/

• Easier Multiple Storyboards: http://spin.atomicobject.com/2014/03/06/multiple-ios-storyboards/