Delphi + iOS:如何覆盖本机UIViewController的委托方法?

时间:2017-09-26 11:27:45

标签: delphi uiviewcontroller firemonkey

如何使用Delphi / FMX覆盖本机 UIViewController 的委托方法,例如 viewDidLoad

谢谢!

1 个答案:

答案 0 :(得分:1)

例如bannerViewWillLoadAd(对于带有UIViewController的viewDidLoad,原理是相同的):

  ADBannerViewDelegate = interface(IObjectiveC)
    ['{95249262-9E7D-4841-B8E4-9EBBDADF3485}']
    procedure bannerView(banner: ADBannerView; didFailToReceiveAdWithError: NSError); cdecl;
    procedure bannerViewActionDidFinish(banner: ADBannerView); cdecl;
    function bannerViewActionShouldBegin(banner: ADBannerView; willLeaveApplication: Boolean): Boolean; cdecl;
    procedure bannerViewDidLoadAd(banner: ADBannerView); cdecl;
    procedure bannerViewWillLoadAd(banner: ADBannerView); cdecl;
  end;

  TiOSBannerAdDelegate = class(TOCLocal, ADBannerViewDelegate)
  private
    [weak]FAd : TiOSBannerAd;
  public
    procedure SetAd(Ad: TiOSBannerAd);
    procedure bannerView(banner: ADBannerView; didFailToReceiveAdWithError: NSError); cdecl;
    procedure bannerViewActionDidFinish(banner: ADBannerView); cdecl;
    function bannerViewActionShouldBegin(banner: ADBannerView; willLeaveApplication: Boolean): Boolean; cdecl;
    procedure bannerViewDidLoadAd(banner: ADBannerView); cdecl;
    procedure bannerViewWillLoadAd(banner: ADBannerView); cdecl;
  end;

procedure TiOSBannerAdDelegate.bannerViewDidLoadAd(banner: ADBannerView);
begin
  if (FAd <> nil) and (FAd.FAdControl <> nil) then
    FAd.FAdControl.DoDidLoad;
end;

  TiOSBannerAd = class(TInterfacedObject, IBannerAd)
  private
    FAd: ADBannerView;
    FAdControl: TCustomBannerAd;
    FDelegate: TiOSBannerAdDelegate;
    FOrientationChangedId: Integer;
    procedure OrientationChangedHandler(const Sender: TObject; const Msg: TMessage);
  public
    constructor Create;
    destructor Free;
    { ICommonAd }
    procedure CancelAction;
    function IsActionInProgress: Boolean;
    function IsLoaded: Boolean;
    function GetAdUnitID: string;
    procedure SetAdUnitID(const Value: string);
    procedure LoadAd;
    { IBannerAd }
    procedure SetBannerAdControl(const AValue: TCustomBannerAd);
    function GetParent: TFmxObject;
    function GetVisible: Boolean;
    procedure Show;
    procedure Hide;
    procedure UpdateControlMetrics;
    procedure UpdateContentFromControl;
  end;

procedure TiOSBannerAd.SetBannerAdControl(const AValue: TCustomBannerAd);
var
  SizesArray: NSMutableArray;
  SizesSet: NSSet;
begin
  FAdControl := AValue;
  if FAdControl <> nil then
  begin
    FAd := TADBannerView.Create;
    FDelegate := TiOSBannerAdDelegate.Create;
    FDelegate.SetAd(Self);
    FAd.setDelegate(FDelegate.GetObjectID);
    SizesArray := TNSMutableArray.Create;
    SizesArray.addObject((ADBannerContentSizeIdentifierLandscape as ILocalObject).GetObjectID);
    SizesArray.addObject((ADBannerContentSizeIdentifierPortrait as ILocalObject).GetObjectID);
    SizesSet := TNSSet.Wrap(TNSSet.OCClass.setWithArray(SizesArray));
    SizesArray.release;
    FAd.setRequiredContentSizeIdentifiers(SizesSet);

    UpdateControlMetrics
  end
  else
  begin
    FAd.setDelegate(nil);
    FAd.release;
    FAd := nil;
    FDelegate := nil;
  end;
end;