diff --git a/components/iosdesigner/ios_views.pas b/components/iosdesigner/ios_views.pas index a7bd59bcb..f4f26371b 100644 --- a/components/iosdesigner/ios_views.pas +++ b/components/iosdesigner/ios_views.pas @@ -124,7 +124,9 @@ const type IMyWidgetDesigner = interface(IUnknown) + ['{AB6C118F-9520-626A-ED24-378E04D03474}'] procedure InvalidateRect(Sender: TObject; ARect: TRect; Erase: boolean); + procedure ClearMyForm; function CreateComponent(ParentComp: TComponent; TypeClass: TComponentClass; const AUnitName: shortstring; @@ -1942,6 +1944,8 @@ end; destructor NSObject.Destroy; begin inherited Destroy; + if assigned(Designer) then + Designer.ClearMyForm; FNIBDocument.Free; end; diff --git a/components/iosdesigner/iosnibdesigner.pas b/components/iosdesigner/iosnibdesigner.pas index 32c1e8d44..fe19d992b 100644 --- a/components/iosdesigner/iosnibdesigner.pas +++ b/components/iosdesigner/iosnibdesigner.pas @@ -56,6 +56,12 @@ type TNSObjectDesignerMediator = class(TDesignerMediator,IMyWidgetDesigner) private FMyForm: NSObject; + protected + // This method is available through IMyWidgetDesigner and is used to + // clear the MyForm variable when the form is destroyed. This is necessary + // because it could be that this mediator is destroyed somewhat later, + // which could lead into problems. + procedure ClearMyForm; public function UseRTTIForMethods(aComponent: TComponent): boolean; override; // needed by the lazarus form editor @@ -366,9 +372,12 @@ var Mediator: TNSObjectDesignerMediator; begin Result:=inherited CreateMediator(TheOwner,aForm); - Mediator:=TNSObjectDesignerMediator(Result); - Mediator.FMyForm:=aForm as NSObject; - Mediator.FMyForm.Designer:=Mediator; + Mediator:=Result as TNSObjectDesignerMediator; + if assigned(result) and assigned(aForm) and (aForm is NSObject) then + begin + Mediator.FMyForm:=aForm as NSObject; + Mediator.FMyForm.Designer:=Mediator as IMyWidgetDesigner; + end; end; class function TNSObjectDesignerMediator.FormClass: TComponentClass; @@ -393,6 +402,11 @@ begin LCLIntf.InvalidateRect(LCLForm.Handle,@ARect,Erase); end; +procedure TNSObjectDesignerMediator.ClearMyForm; +begin + FMyForm := nil; +end; + procedure TNSObjectDesignerMediator.SetBounds(AComponent: TComponent; NewBounds: TRect); begin if AComponent is tiOSFakeComponent then begin