Восстановление NSUserActivity с шаблоном координатора + UITabBarController - PullRequest
0 голосов
/ 04 октября 2019

Кто отвечает за restoreUserActivityState, если я использую шаблон координатора? В моем подклассе UITabBarController я могу напрямую получить доступ к контроллеру представления, но я не уверен, должен ли я связать это, используя ответственного координатора. С координатором мне нужно передать NSUserActivity сначала координатору, а затем от координатора ответственному контролеру представления. Что такое чистый подход?

AppDelegate.m

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler
{
    if ([userActivity.activityType isEqualToString:CSSearchableItemActionType]) {
        UITabBarController *tabBarController = (__kindof UITabBarController *)self.window.rootViewController;
        restorationHandler(@[tabBarController]);
    }
    return YES;
}

UITabBarController.m (подкласс)

// ------------  ------------  ------------  ------------  ------------  ------------
#pragma mark - UIUserActivityRestoring

- (void)restoreUserActivityState:(NSUserActivity *)activity
{
    [self setSelectedViewController:self.mapCoordinator.presenter];
    UIViewController *viewController = [self.mapCoordinator.presenter.childViewControllers firstObject];
    [viewController restoreUserActivityState:activity];
}

Контроллер отвечающего представления

// ------------  ------------  ------------  ------------  ------------  ------------
#pragma mark - UIUserActivityRestoring

- (void)restoreUserActivityState:(NSUserActivity *)userActivity
{
    NSString *stationObjectIDURI = userActivity.userInfo[CSSearchableItemActivityIdentifier];
    NSURL *URL = [NSURL URLWithString:stationObjectIDURI];
    Station *station = [Station stationWithURIRepresentation:URL inMoc:[self context]];
    if (station) {
        [self.mapView updateRegionForCoord:station.coordinate];
        [self.mapView setRegionChangeLock:YES];
        [self.mapView selectAnnotation:station animated:YES];
    }
}

Координатор

- (void)start
{
    StationMapVC *stationMapVC = [StationMapVC instantiate];
    stationMapVC.context = self.context;
    UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Map", nil)
                                                       image:[UIImage
                                                              imageNamed:@"map_marker"]
                                                         tag:0];
    stationMapVC.tabBarItem = item;
    stationMapVC.coordinator = self;
    self.presenter.navigationBarHidden = YES;
    [self.presenter pushViewController:stationMapVC animated:NO];
    self.stationMapVC = stationMapVC;
}
...