Невозможно изменить вкладку страницы с вкладками после отображения модального окна

Я столкнулся с проблемой со страницей с вкладками в iOS. Я добавил 5 страниц навигации на странице с вкладками. После показа и закрытия модального окна я не могу изменить вкладку при нажатии. Если я удерживаю другую вкладку в течение 3-4 секунд (долгое нажатие), то эта вкладка выбирается. Не уверен, в чем проблема. Логов тоже нет.

Тот же код отлично работает на Android. Подскажите, пожалуйста, если кто-то сталкивался с подобной проблемой.

Код домашней страницы

        private bool tabsConfigured = false;

        public HomeView (HomeViewModel viewModel)
        {
            InitializeComponent();
            NavigationPage.SetHasNavigationBar(this, false);

            if (Device.RuntimePlatform == Device.Android)
            {
                On<Xamarin.Forms.PlatformConfiguration.Android>().SetToolbarPlacement(ToolbarPlacement.Bottom);
                On<Xamarin.Forms.PlatformConfiguration.Android>().SetBarItemColor(Color.FromHex("#c1c1c1"));
                On<Xamarin.Forms.PlatformConfiguration.Android>().SetBarSelectedItemColor(Color.White);
                On<Xamarin.Forms.PlatformConfiguration.Android>().SetIsSwipePagingEnabled(false);
                On<Xamarin.Forms.PlatformConfiguration.Android>().SetOffscreenPageLimit(5);
            }
            else if (Device.RuntimePlatform == Device.iOS)
            {
                this.BarBackgroundColor = Color.FromHex("#0c293d");
                //this.BarTextColor = Color.White;
            }

            this.ViewModel = viewModel;
            this.ViewModel.SwitchTabAction = OnSwitchTabFromViewModel;

#if __IOS__
            InitTabs();
#endif
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
#if __ANDROID__
            InitTabs();
#endif
        }

        protected override void OnDisappearing()
        {
            base.OnDisappearing();
            this.ViewModel.SwitchTabAction = null;
        }

        private void InitTabs()
        {
            var logService = AutofacUtil.Instance.Resolve<ILogService>();

            try
            {
                 if (tabsConfigured) return;

                this.Children.Add(this.GetInitialTabPage<DestinationsViewModel>("tab_guide", "Guide"));
                this.Children.Add(this.GetInitialTabPage<GroupsViewModel>("tab_chats", "Groups"));
                this.Children.Add(this.GetInitialTabPage<ItineraryViewModel>("tab_itineraries", "Itineraries"));
                this.Children.Add(this.GetInitialTabPage<ExpenseViewModel>("tab_expenses", "Expenses"));
                this.Children.Add(this.GetInitialTabPage<MoreViewModel>("tab_mores", "More"));
#if __ANDROID__
                this.BatchCommit();
#endif

                tabsConfigured = true; //Important to be here.

                //Setting Current Page
                if (this.ViewModel.ActiveTab >= 1)
                    this.CurrentPage = this.Children[this.ViewModel.ActiveTab];
                else if (this.ViewModel.ActiveTab == 0) //OnPageChanged doesn't get called for first tab.
                {
                    CurrentPage = this.Children[this.ViewModel.ActiveTab];
                    OnPageChanged();
                }
            }
            catch (Exception ex)
            {
                logService.Error(ex);
            }
        }

        public NavigationPage GetInitialTabPage<T>(string icon, string title) where T : BaseCoreViewModel
        {
            Page page = new TabLoadingPage(typeof(T));

            NavigationPage navigationPage = new NavigationPage(page);
            navigationPage.Icon = icon;
            navigationPage.Title = title;
            navigationPage.BarBackgroundColor = Color.FromHex("#0c293d");
            navigationPage.BarTextColor = Color.White;
            return navigationPage;
        }

Код для отображения Modal. Вызов PushModalAsync для отображения модального окна.

    public class NavigationService : INavigationService
    {
        private INavigation _mainNavigation = null;
        private INavigation _currentTabNavigation = null;
        private INavigation _currentModalNavigation = null;
        private NavigationPage _currentModalNavPage = null;

        public void SetMainXamarinFormsNavigation(INavigation navigation)
        {
            _mainNavigation = navigation;
        }

        public void SetTabXamarinFormsNavigation(INavigation navigation)
        {
            _currentTabNavigation = navigation;
        }

        public async Task PushAsync<T>(object parameters = null, bool animate = true) where T : BaseCoreViewModel
        {
            var page = ViewCreator.CreateViewAndViewModelAndCallInit<T>(parameters);

            INavigation currentNavigation = null;
            if (_currentModalNavigation != null)
                currentNavigation = _currentModalNavigation;
            else if (_currentTabNavigation != null)
                currentNavigation = _currentTabNavigation;
            else if (_mainNavigation != null)
                currentNavigation = _mainNavigation;

#if __IOS__
            var currentPage = currentNavigation.NavigationStack.ElementAt(currentNavigation.NavigationStack.Count - 1);
            var oldTitle = currentPage.Title;
            currentPage.Title = "Back";
#endif
            await currentNavigation.PushAsync(page, animate);

#if __IOS__
            currentPage.Title = oldTitle;
#endif
        }

        public async Task PushModalAsync<T>(object parameters = null, bool animate = true) where T : BaseCoreViewModel
        {
            if (_mainNavigation == null) return;

#if __ANDROID__
            var emptyPage = new FirstEmptyNavPage();
#endif
            var startPage = ViewCreator.CreateViewAndViewModelAndCallInit<T>(parameters, true);

#if __ANDROID__
            _currentModalNavPage = new NavigationPage(emptyPage);
#else
            _currentModalNavPage = new NavigationPage(startPage);
#endif

            _currentModalNavPage.Popped += _currentModalNavPage_Popped;
            _currentModalNavPage.BarBackgroundColor = Color.FromHex("#0c293d");
            _currentModalNavPage.BarTextColor = Color.White;

#if __ANDROID__
            await _currentModalNavPage.PushAsync(startPage);
#endif

            await _mainNavigation.PushModalAsync(_currentModalNavPage, animate);

            if (_currentModalNavPage != null)
                _currentModalNavigation = _currentModalNavPage.Navigation;
        }

        private async void _currentModalNavPage_Popped(object sender, NavigationEventArgs e)
        {
            if (_currentModalNavPage != null && _currentModalNavPage.CurrentPage is FirstEmptyNavPage)
            {
                _currentModalNavPage.Popped -= _currentModalNavPage_Popped;
                _currentModalNavPage = null;
                _currentModalNavigation = null;
                await _mainNavigation.PopModalAsync(false);
            }
        }

        public async Task PopAsync(bool animate = true)
        {
            if (_currentModalNavigation != null && _currentModalNavigation.NavigationStack.Count > 1)
                await _currentModalNavigation.PopAsync(animate);
            else if (_currentModalNavigation != null && _currentModalNavigation.NavigationStack.Count > 1)
            {
                await _currentModalNavigation.PopModalAsync(animate);
                _currentModalNavigation = null;
            }
            else if (_currentTabNavigation != null)
                await _currentTabNavigation.PopAsync(animate);
            else if (_mainNavigation != null)
                await _mainNavigation.PopAsync(animate);
        }

        public async Task PopModalAsync(bool animate = true)
        {
            if (_currentModalNavigation != null)
            {
                await _currentModalNavigation.PopModalAsync(animate);
                _currentModalNavigation = null;
            }
        }
    }

Вам нужно поделиться кодом, без него мы просто подбросим вам гипотезу.

FreakyAli 03.02.2019 21:39

@G.hakim Добавлен код для справки.

Pravin Patil 04.02.2019 05:34

почему вы добавили await async ? Операции пользовательского интерфейса выполняются в основном потоке, который ожидается автоматически.

Pooja Kamath 06.02.2019 04:24

@pooja, о каком методе ты говоришь?

Pravin Patil 07.02.2019 03:41

общедоступная асинхронная задача PopModalAsync (bool animate = true)

Pooja Kamath 07.02.2019 03:42

_currentModalNavigation.PopModalAsync является асинхронным, поэтому

Pravin Patil 07.02.2019 11:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
164
0

Другие вопросы по теме