diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm index d2a82eb4fe..eceaa22476 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm @@ -37,12 +37,11 @@ extern NSString * const kSearchStateKey = @"SearchStateKey"; @property (nonatomic) MWMSearchTableViewController * tableViewController; @property (nonatomic) MWMSearchDownloadViewController * downloadController; +@property (nonatomic) BOOL haveDownloadedMaps; + @end @implementation MWMSearchManager -{ - int m_mapsObserverSlotId; -} - (nullable instancetype)initWithParentView:(nonnull UIView *)view delegate:(nonnull id)delegate @@ -55,7 +54,6 @@ extern NSString * const kSearchStateKey = @"SearchStateKey"; self.rootView.delegate = delegate; self.parentView = view; self.state = MWMSearchManagerStateHidden; - [MWMFrameworkListener addObserver:self]; } return self; } @@ -267,6 +265,11 @@ extern NSString * const kSearchStateKey = @"SearchStateKey"; - (void)changeToDefaultState { + using namespace storage; + auto const & s = GetFramework().Storage(); + TCountriesVec downloadedCountries, availCountries; + s.GetChildrenInGroups(s.GetRootId(), downloadedCountries, availCountries); + self.haveDownloadedMaps = !downloadedCountries.empty(); self.view.alpha = 1.; [self updateTopController]; [self.navigationController popToRootViewControllerAnimated:NO]; @@ -314,19 +317,25 @@ extern NSString * const kSearchStateKey = @"SearchStateKey"; - (UIViewController *)topController { - using namespace storage; - auto & s = GetFramework().Storage(); - TCountriesVec downloadedCountries, availCountries; - s.GetChildrenInGroups(s.GetRootId(), downloadedCountries, availCountries); - BOOL const haveMap = (downloadedCountries.size() != 0); - return haveMap ? self.tabbedController : self.downloadController; + if (self.haveDownloadedMaps || self.state == MWMSearchManagerStateHidden) + { + return self.tabbedController; + } + else + { + if (!self.downloadController) + self.downloadController = [[MWMSearchDownloadViewController alloc] initWithDelegate:self]; + return self.downloadController; + } } -- (MWMSearchDownloadViewController *)downloadController +- (void)setDownloadController:(MWMSearchDownloadViewController *)downloadController { - if (!_downloadController) - _downloadController = [[MWMSearchDownloadViewController alloc] initWithDelegate:self]; - return _downloadController; + _downloadController = downloadController; + if (downloadController) + [MWMFrameworkListener addObserver:self]; + else + [MWMFrameworkListener removeObserver:self]; } - (MWMSearchTabbedViewController *)tabbedController diff --git a/iphone/Maps/Classes/Framework/MWMFrameworkListener.h b/iphone/Maps/Classes/Framework/MWMFrameworkListener.h index 6e4694543a..1e03fa1673 100644 --- a/iphone/Maps/Classes/Framework/MWMFrameworkListener.h +++ b/iphone/Maps/Classes/Framework/MWMFrameworkListener.h @@ -4,6 +4,7 @@ + (MWMFrameworkListener *)listener; + (void)addObserver:(id)observer; ++ (void)removeObserver:(id)observer; @property (nonatomic, readonly) location::EMyPositionMode myPositionMode; @property (nonatomic) UserMark const * userMark; diff --git a/iphone/Maps/Classes/Framework/MWMFrameworkListener.mm b/iphone/Maps/Classes/Framework/MWMFrameworkListener.mm index 0f7b03ec40..d1d0bd2806 100644 --- a/iphone/Maps/Classes/Framework/MWMFrameworkListener.mm +++ b/iphone/Maps/Classes/Framework/MWMFrameworkListener.mm @@ -81,6 +81,19 @@ void loopWrappers(TObservers * observers, TLoopBlock block) }); } ++ (void)removeObserver:(TObserver)observer +{ + dispatch_async(dispatch_get_main_queue(), ^ + { + MWMFrameworkListener * listener = [MWMFrameworkListener listener]; + [listener.routeBuildingObservers removeObject:observer]; + [listener.myPositionObservers removeObject:observer]; + [listener.userMarkObservers removeObject:observer]; + [listener.storageObservers removeObject:observer]; + [listener.drapeObservers removeObject:observer]; + }); +} + - (instancetype)initListener { self = [super init];