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-способе вы должны создать свойство «Загрузка» в своей модели представления и привязать его к индикатору выполнения в представлении.

Вот хорошее видео Стюарта, как это сделать: 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.

Если вы загружаете данные в «Первый контроллер просмотра», то при начале загрузки данных запустите ProgressHud с BTProgressHUD.Show("test");, и когда ваши данные будут загружены, удалите этот HUD из представления непосредственно перед переходом к «Второму контроллеру просмотра».

И если вы загружаете данные во «Второй контроллер представления», то сначала выполните навигацию от «Первого контроллера представления» к «Второму контроллеру представления», а затем покажите HUD непосредственно перед загрузкой данных во втором контроллере представления BTProgressHUD.Show("test"); и удалите его после загрузки данных. .

person Mystery    schedule 30.11.2013