Jump to content
  • Status: Fixed
  • Priority: Critical
  • Resolution: Fixed
  • Platform: iOS
  • Affects version: 1.18.11.0

Всё началось с того, что клиенты стали жаловаться, что на старых айфонах ( 7, 8 ) приложение падает.

Нашли для тестов iPhone 6 c IOS 15.7.9 и воспроизвели данную ошибку.

На современных версиях IOS (16-18) всё работает нормально. Ниже какой версии IOS проявляется данная ошибка сказать затрудняюсь.

Падает на строке AboutCollectionView.Realign; Если данную строку закомментировать, то всё работает.

Project18.zip


Fix version: 1.18.12.0

User Feedback

Recommended Comments

  • Administrators

Какая задача решается вызовом AboutCollectionView.Realign из события TfgForm.OnShow?

  • Administrators
  • На ARM симуляторе iOS 15.5 не удалось воспроизвести.
  • На iPhone 6 (iOS 12.5.7) не удалось воспроизвести так же.
  • На iPhone 15 Pro Max (iOS 18.3.2) не удалось воспроизвести.
  • На iPad 7G (iOS 16.1) - удалось воспроизвести
  • Administrators

В старых версия iOS был баг связанный с нулевым размером UICollectionView при старте, который используется в реализации TfgCollectionView. Смысл такой этой баги, если у списка нулевой размер, то это приводило к падению в старых версиях. В вашем случае, это не явно, вы вызываете Realign из события TfgForm.OnCreate для формы, которая еще не отображена на экране и не проинициализирована полностью для отображения. Что в целом является не правильным. Даже не смотря на то, что свойства у компонентов имеют не нулевые размеры, не означает, что нативные компоненты имеют такие же размеры в OnCreate. Так как нативные представления синхронизируются и получают актуальные состояния уже в OnShow.

В результате, представление вкладки TfgPage получает нулевой размер с дальнейшим выравниванием списка TfgCollectionView. Как итог приложение падает.

Решение:

  1. Если очень нужно, заменить вызов Realign на RequestRealign. Этот метод выполняет отложенное выравнивание.
  2. Не использовать выравнивание на этапе создания формы.
  • Administrators

Нашел обходное решение. Однако, все равно, не советую вызывать выравнивание до OnShow.

Mineev

Active subscription
9 часов назад, Yaroslav Brovin сказал:

Какая задача решается вызовом AboutCollectionView.Realign из события TfgForm.OnShow?

Изменение размеров и выравнивание компонентов на форме. Это форма из реального проекта. Лишний код просто вычистил. Оставил лишь то, что приводит к ошибке.

Mineev

Active subscription
8 часов назад, Yaroslav Brovin сказал:

вы вызываете Realign из события TfgForm.OnCreate

Я не вызываю Realign в OnCreate!!! Откуда вы это взяли?

7 часов назад, Yaroslav Brovin сказал:

не советую вызывать выравнивание до OnShow

Realign и вызывается именно в OnShow! И приложение падает!

  • Administrators
10 hours ago, Mineev said:

Я не вызываю Realign в OnCreate!!! Откуда вы это взяли?

10 hours ago, Mineev said:

Realign и вызывается именно в OnShow! И приложение падает!

Ваш код раз, событие OnCreate - встраиваете страницу:

procedure TFormMain.fgFormCreate(Sender: TObject);
begin
  try
    var Screen := TAboutScreen.Create(Self{, False, False});
    var Page := ScreensPageControl.AddPage;

    AddFrame(Page, Screen);
  except
    on E: Exception do
//      LogStr('TFormMain.fgFormCreate.%s: «%s»', [E.ClassName, E.Message]);
  end;
end;

Ваш код два, создаете форму и вызываете у нее метод Show:

procedure AddFrame(const AParent: TfgControl; const AFrame: TfgForm; const AFlexGrow: Single = 1);
begin
  AFrame.BeginUpdate;
  try
    AFrame.PositionMode := TfgPositionMode.Relative;
    AFrame.Alignment.FlexGrow := AFlexGrow;
    AFrame.FullScreen := False;
    AFrame.Parent := AParent;
    AFrame.Show;
  finally
    AFrame.EndUpdate;
  end;
end;

Ваш код три - вызов Realign:

procedure TAboutScreen.fgFormShow(Sender: TObject);
begin
  inherited;
  FillAbout;
  AboutCollectionView.Realign;
end;

P.S. Иногда полезно воспользоваться отладчиком.

Mineev

Active subscription

Код встраивания взят из вашего примера. Как в этом случае пользоваться событиями?

  • Administrators
15 hours ago, Mineev said:

Код встраивания взят из вашего примера.

Я тоже вызываю Realign?

15 hours ago, Mineev said:

Как в этом случае пользоваться событиями?

Прочитать мои рекомендации выше о том, чего НЕ СЛЕДУЕТ делать. А так же прочитать "Решение" выше.

Если вы встраиваете форму, то так же можно делегировать решение о вызове Realign родительской форме. Например, в OnShow родительской формы сделать нотификацию вложенных форм. 

В вашем проекте, на текущий момент, вызов Realign несет только вред (даже, если это не привело бы к падению). Потому что работает в холостую на неактуальных размерах и это в свою очередь приводит к задержке открытие главной формы. 

Mineev

Active subscription
8 часов назад, Yaroslav Brovin сказал:

Я тоже вызываю Realign?

Вы вызываете Show из Create! А в событии OnShow вполне логично вызвать Realign!

8 часов назад, Yaroslav Brovin сказал:

Если вы встраиваете форму, то так же можно делегировать решение о вызове Realign родительской форме.

У меня в приложении около 30 таких встроенных форм. Как вы себе представляете это делегирование? Я должен в событии OnShow главной формы управлять размерами и расстановкой элементов на 30 формах?

Create an account or sign in to comment

Recently Browsing 0

  • No registered users viewing this page.