ProgressHUD и TouchUpInside

Имам моя ViewController като

public partial class TestView
        : MvxViewController
{
...code here...
}

и зареждам следващия си ViewController на събитие на бутон TouchUpInside така:

btnSearch.TouchUpInside  += (object sender, EventArgs e) => {
        BTProgressHUD.Show("test");
        ViewModel.GoParameterizedCommand.Execute(null);
    };

това събитие е дефинирано във ViewDidLoad. Моето „тестово“ съобщение се показва на следващия ViewController, а не по време на зареждането на този. Как мога да покажа това съобщение по време на зареждане, а не при зареждане на следващия ViewController? Опитах се да използвам и MBProgressHUD

btnSearch.TouchUpInside  += (object sender, EventArgs e) => {
        var hud = new MTMBProgressHUD (View) {
            LabelText = "Waiting...",
            RemoveFromSuperViewOnHide = true
        };


        View.AddSubview(hud);
        hud.Show (animated: true);

        ViewModel.GoParameterizedCommand.Execute(null);
    };

но поведението е същото.


person Luigi Saggese    schedule 21.11.2013    source източник


Отговори (3)


Изглежда, че се опитвате да работите с ProgressHUD в слоя View. В MVVM-way трябва да създадете свойство "Зареждане" във вашия ViewModel и да го свържете към лентата на прогреса в View.

Ето добър видеоклип на Stuart как да направите това: http://youtu.be/6fNXGErr9to

И ето примерен код: https://github.com/MvvmCross/NPlus1DaysOfMvvmCross/tree/master/N-34-Progress

person olexa.le    schedule 25.11.2013
comment
Това изглежда е заобиколно решение, а не решение. Тествал съм го. Зададох свойство на моя ViemModel, когато се извиква команда за изпълнение (както в github, публикуван от вас). Свойството и progressHud са правилно зададени. Проблемът е, че се появява изскачащ прозорец, който не се показва по време на зареждане, но се зарежда, когато се върна. (Примерен изглед 1 -› изглед 2 -› изглед 1 сега се показва на изглед 1, а не по време на първия преход...) - person Luigi Saggese; 25.11.2013

Правя нещо подобно в едно от моите приложения.

Имам свойство IsLoading в моя ViewModel, което задавам дали нещо се зарежда или не. Тогава в моя ViewController се абонирам за промени на Loading като това:

ViewModel.WeakSubscribe(() => ViewModel.IsLoading, (sender, args) =>
{
    if (ViewModel.IsLoading)
    {
        ShowLoadingDialog("Loading Resource");
    }
    else
    {
        DismissLoadingDialog();
    }
});

void ShowLoadingDialog(string text)
{
    DismissLoadingDialog();
    BTProgressHUD.Show(text, -1, BTProgressHUD.MaskType.Black);
}

void DismissLoadingDialog()
{
    if (BTProgressHUD.IsVisible)
        BTProgressHUD.Dismiss();
}

Правя това в ViewDidLoad(). Бихте могли да направите нещо подобно в първия си изглед, след което във втория можете просто да извикате DismissLoadingDialog() или просто да се уверите, че сте извикали ViewWillDisappear() или ViewDidDisappear() в първия ViewModel, така че да бъде отхвърлен правилно.

person Cheesebaron    schedule 25.11.2013

Зареждането на контролера за изглед няма да отнеме повече от „микро секунди“. Зареждането на данни в контролера на изгледа ще отнеме известно време и през това време трябва да покажете този ProgressHUD.

Ако зареждате данни в „First View Controller“, тогава при започване на зареждането на данни стартирайте ProgressHud с BTProgressHUD.Show("test"); и когато вашите данни приключат със зареждането, премахнете този HUD от изгледа точно преди да преминете към „Second View Controller“.

И ако зареждате данни във „Second View Controller“, тогава направете навигация първо от „First View Controller“ към „Second View Controller“ и след това покажете HUD точно преди зареждането на данни във Second View Controller BTProgressHUD.Show("test"); и го премахнете, след като данните бъдат заредени .

person Mystery    schedule 30.11.2013