Почему я не могу вызвать этот публичный метод из другого класса в моем приложении? - PullRequest
0 голосов
/ 09 сентября 2018

Я добавил публичный метод для возврата переменной pageLoaded, но Visual Studio показывает эту ошибку «Ссылка на объект необходима для метода MainPage.PageLoaded (), а не static». Логика заключается в том, чтобы завершить Splash Activiy, только если pageLoaded имеет значение true. Если у кого-то есть идея получше, было бы неплохо знать, я только начал изучать C # / Xamarin.

Мой код:

namespace MyApp
{
    public partial class MainPage : ContentPage
    {
        private bool pageLoaded = false;
        public MainPage()
        {
            InitializeComponent();
            webnav.HeightRequest = 1000;
            webnav.WidthRequest = 1000;
            webnav.Source = "https://www.example.com";
        }

        public void Webnav_Navigated(object sender, WebNavigatedEventArgs e)
        {
            pageLoaded = true;
        }

        public bool PageLoaded()
        {
            return pageLoaded;
        }
    }
}

Код 2:

...
...
using MyApp;
namespace MyApp.Droid
{
    [Activity(Label = "My App", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = false, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
            while (true)
            {
                if (MainPage.PageLoaded())
                {
                    SplashScreen.fa.Finish();
                    break;
                }
            }
        }
   }
}

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Проблема (ы):

Ваш .PageLoaded() метод является методом экземпляра . Он может быть вызван только для экземпляра объекта типа MainPage

Ваша ссылка на него, на вашем заставке, пытается вызвать его как статический метод , который имеет две проблемы:

  1. Как указано выше, вы не определили его, используя статическое ключевое слово
  2. Даже если вы определите его как статический, он ничего не скажет вам о реальной загружаемой странице

Решение:

Не делай этого. Управляйте видимостью вашего заставки из экземпляра страницы, который знает, когда он был загружен. Создайте и создайте ссылку на заставку из MainPage

Edit:

Для дальнейшего уточнения разницы:

// calling a method against the static definition of the class
MainPage.PageLoaded();
// calling a method against an instance of the class
new MainPage().PageLoaded();

Приведенный выше код является не решением, а примером различия между методом экземпляра и статическим методом. Ваш PageLoaded метод не должен быть статичным , поскольку вы уже все выложили.

0 голосов
/ 09 сентября 2018

Поскольку класс MainPage не является статическим, вам необходимо создать объект класса MainPage и использовать этот объект для вызова метода из этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...