Кита
26.10.2018
10:31:36
и с NSObejct и c Java должны. По крайней мере в VS for Mac
Boris
26.10.2018
10:33:24
Ну так мы же не видим код базового класса на Java/ObjC. Где в таком случае мы увидим ворнинг?
Проверка орфографии в скайпе говорит, что не знает никакого шумарина ?
Google
Кита
26.10.2018
10:37:05
Boris
26.10.2018
10:37:41
Сигнатуры видны в мета-дате, да
Но ворнингов по мета-дате пока не встречал
Я думаю в выходные поглубже эту тему покопать чтобы понять как надежно избегать таких проблем
Кита
26.10.2018
10:42:07
Просто не вызывать virtual в конструкторе. А если вызывать то в методе должно происходить что-то не влияющее на общую логику класса
vladimir
26.10.2018
10:45:08
today I learnt, что базовый конструктор всегда вызовется автоматически даже если не указан явно -_-
Boris
26.10.2018
10:46:02
vladimir
26.10.2018
10:46:47
да это понятно, но до этого я думал, что его надо явно прописать типо Derived() : base()
в общем, спасибо, почувствовал себя глупым
https://stackoverflow.com/questions/159296/how-can-i-prevent-a-base-constructor-from-being-called-by-an-inheritor-in-c
второй ответ интересный
Boris
26.10.2018
10:49:45
Да. Интересный. Для сериализаций и правда может понадобиться
Или для юнит-тестов каких-то
Google
Кита
26.10.2018
11:12:59
Alexander
26.10.2018
11:20:40
Kirill
26.10.2018
11:22:01
Alexander
26.10.2018
11:22:13
Maxim
26.10.2018
11:51:01
Через точку
Bulat
26.10.2018
11:54:55
Я уже сделал через grouping
Alexander
26.10.2018
12:50:57
Dmitry
26.10.2018
13:39:50
Всем привет, вопрос от начинающего (ногами не бить плиз).
1. Xamarin Forms.
2. Есть переход с RegisterPage на OnBoardingPage. При клике на кнопке RegisterPage происходит
await Navigation.PushModalAsync(new OnBoardingPage()).
3. У OnBoardingPage есть ViewModel с состояниями экранов, два из которых Loading и Normal.
4. У этой же ViewModel есть асинхронный метод public async void SetPanelTagsCollection(), который обращается к серверу и возвращает коллекцию объектов.
5. Задача — при переходе на OnBoardingPage, отобразить состояние Loading, асинхронно запустить SetPanelTagsCollection(), дождаться результатов и после этого отобразить состояние Normal.
Как это корректно сделать? Не получается - то Loading застывает на экране (при этом SetPanelTagsCollection() грузится корректно, видно при свайпе на второй экран онбординга), то при переходе RegisterPage -> OnBoardingPage пропускается Loading и с подвисанием экран грузится с Normal.
vladimir
26.10.2018
13:43:21
вы используете баиндинги?
Maxim
26.10.2018
13:46:11
Dmitry
26.10.2018
13:48:08
В Xaml <stateContainer:StateContainer x:Name="StateContainerBoarding"
State="{Binding OnBoardingInState}"
В Xaml в описании каждой из 5 страниц
ViewModel общая на весь CarouselPage (она же OnBoardingPage) включающий 5 страниц ContentPage. На каждой ContentPage свой StateContainer и Binding
vladimir
26.10.2018
13:54:55
если есть привязки, то просто ставьте состояние Loading перед SetPanelTagsCollection и Normal после о_о
а где сам SetPanelTagsCollection вызывается?
Maxim
26.10.2018
13:55:18
Dmitry
26.10.2018
13:56:18
а где сам SetPanelTagsCollection вызывается?
public ScopeOfHelpViewModel()
{
if (!CrossConnectivity.Current.IsConnected)
{
MessageText = "Нет интернет-соединения";
OnBoardingInState = OnBoardingState.NoInternet;
}
else
{
Device.BeginInvokeOnMainThread(async () =>
{
MessageText = "Загружаю данные";
OnBoardingInState = OnBoardingState.Loading;
});
SetPanelTagsCollection();
vladimir
26.10.2018
13:56:38
ага
Google
vladimir
26.10.2018
13:57:09
Task.Run(SetPanelTagsCollection);
оно же весь конструктор блокирует
и ничего там асинхронного нет в таком случае
Dmitry
26.10.2018
13:58:05
Task.Run(()=>SetPanelTagsCollection()); ?
vladimir
26.10.2018
13:58:22
можно как я написал
а вот это OnBoardingInState = OnBoardingState.Loading;
а затем и Normal ставьте внутри SetPanelTagsCollection
и можно без Device.BeginInvokeOnMainThread
хотя, когда будете присваивать коллекцию модели к коллекции VM, то лучше использовать Device.BeginInvokeOnMainThread
Dmitry
26.10.2018
14:05:05
Сейчас внутренности SetPanelTagsCollection() опишу
vladimir
26.10.2018
14:06:08
а ваше свойство коллекции вызывает NotifyPropertyChanged?
Dmitry
26.10.2018
14:16:33
vladimir
26.10.2018
14:17:35
покажите, как объявлено ServerTagsCollection
Dmitry
26.10.2018
14:19:18
public ObservableCollection<ScopeOfHelp> ServerTagsCollection = new ObservableCollection<ScopeOfHelp>();
Maxim
26.10.2018
14:19:40
А почему коллекция не свойством?:)
{get; set;}
vladimir
26.10.2018
14:20:00
OnPropertyChanged("ServerTagsCollection"), во-первых (или nameof)
во-вторых, это не должно быть на каждой итерации
в-третьих, это лучше всего делается внутри свойства коллекции
Maxim
26.10.2018
14:20:29
Dmitry
26.10.2018
14:20:49
Maxim
26.10.2018
14:21:04
Я тоже так думаю
public ObservableCollection<ScopeOfHelp> ServerTagsCollection {get; set;} = new ObservableCollection<ScopeOfHelp>() ;
vladimir
26.10.2018
14:21:16
нужно обновиться своство само
Google
vladimir
26.10.2018
14:21:32
и уж тем более не делать это на каждом добавленном элементе
создайте локальный List<ScopeOfHelp> list
в него все ваши new ScopeOfHelp добавляйте
а потом ServerTagsCollection = new ObservableCollection<ScopeOfHelp>(list)
Dmitry
26.10.2018
14:23:44
Я пробую все чт овы предлагаете, отпишусь, 5 мин
Maxim
26.10.2018
14:24:19
vladimir
26.10.2018
14:24:38
а свойство замените
private ObservableCollection<ScopeOfHelp> serverTagsCollection;
public ObservableCollection<ScopeOfHelp> ServerTagsCollection {
get => serverTagsCollection;
set {serverTagsCollection = value; OnPropertyChanged(nameof(ServerTagsCollection))}
}
и уберите OnPropertyChanged из SetPanelTagsCollection
Maxim
26.10.2018
14:25:56
vladimir
26.10.2018
14:28:09
Maxim
26.10.2018
14:29:05
vladimir
26.10.2018
14:30:00
как при ServerTagsCollection = new ObservableCollection<ScopeOfHelp>(list) оно вызовет, что у него коллекция обновилась, если это будет новый объект?
Maxim
26.10.2018
14:30:33
vladimir
26.10.2018
14:31:01
чтобы не вызывать миллион раз изменение коллекции, а сделать это один раз, когда все данные будут готовы
Maxim
26.10.2018
14:31:44
vladimir
26.10.2018
14:33:00
его обычно используют, если данные будут добавляться впоследствии ещё, а если только один раз загружены, то он не нужен
какой у человека сценарий, я не знаю, возможно, он планирует догружать данные
Maxim
26.10.2018
14:34:30
vladimir
26.10.2018
14:35:05
почему же?
а что если впоследствии будут добавляться элементы по одному?
мы не будем полностью новые коллекции создавать
Maxim
26.10.2018
14:38:39
vladimir
26.10.2018
14:40:28
если мы объект коллекции заменим, об этом можно будет узнать только если соответствующую ей привязку уведомить
Google
vladimir
26.10.2018
14:40:58
Maxim
26.10.2018
14:46:00
Dmitry
26.10.2018
14:49:05
vladimir
26.10.2018
14:49:14
покажите код
Dmitry
26.10.2018
14:49:32
сек
https://pastebin.com/hRqx4VBe
Kirill
26.10.2018
14:54:17
https://pastebin.com/hRqx4VBe
лучше прокинь во ViewModel метод OnAppearing и в нм создай таск, в котором
await SetPanelTagsCollection();
OnBoardingInState = OnBoardingState.Normal;
И как объявлено свойство OnBoardingInState ?
Dmitry
26.10.2018
14:58:31
Kirill
26.10.2018
14:58:53
Dmitry
26.10.2018
14:59:07
public enum OnBoardingState
{
Loading, //Загрузка данных (индикатор загрузки по центру экрана)
Normal, //Отображение данных
Error, //Ошибка загрузки данных
NoInternet, //Отсутствует интернет-соединение
NoData //Нет данных
}
public OnBoardingState OnBoardingInState
{
get => _onBoardingInState;
set { _onBoardingInState = value; OnPropertyChanged(); }
}
private OnBoardingState _onBoardingInState;
Kirill
26.10.2018
15:02:27
Dmitry
26.10.2018
15:03:32
public void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Kirill
26.10.2018
15:08:47
Dmitry
26.10.2018
15:08:54
Да
Кита
26.10.2018
15:09:32
а в каком потоке?)
Dmitry
26.10.2018
15:10:14
Кита
26.10.2018
15:18:40
ну по коду посмотреть) ты используешь Task.Run(() =>SetPanelTagsCollection()); и ждешь что у тебя на UI что-то обновится