Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS UIAlertViewDelegate und anonyme Mehtoden (https://www.delphipraxis.net/179561-uialertviewdelegate-und-anonyme-mehtoden.html)

Crocotronic 16. Mär 2014 14:29

UIAlertViewDelegate und anonyme Mehtoden
 
Hallo,
ich kämpfe gerade mit dem UIAlertViewDelegate. Um die Klasse so universell wie möglich zu halten, habe ich mir gedacht, dass ich dem Delegate eine anonyme Methode mitgebe.
Hier die Klasse:
Delphi-Quellcode:
  TAlertHandlerProc = reference to procedure(alertView: UIAlertView;
    clickedButtonAtIndex: NSInteger);

  TAlertViewDelegate = class(TOCLocal, UIAlertViewDelegate)
  private
   FHandler: TAlertHandlerProc;
  protected
   constructor Create(AHandler: TAlertHandlerProc);
  public
   class function Construct(AHandler: TAlertHandlerProc): TAlertViewDelegate;
   procedure alertView(alertView: UIAlertView; clickedButtonAtIndex: NSInteger); cdecl;
   procedure alertViewCancel(alertView: UIAlertView); cdecl;
  end;

class function TAlertViewDelegate.Construct(
  AHandler: TAlertHandlerProc): TAlertViewDelegate;
begin
 Result:= Self.Create(AHandler);
end;

constructor TAlertViewDelegate.Create(AHandler: TAlertHandlerProc);
begin
 inherited Create;
 FHandler:= AHandler;
end;

procedure TAlertViewDelegate.alertView(alertView: UIAlertView;
  clickedButtonAtIndex: NSInteger);
begin
 if Assigned(FHandler) then
  FHandler(alertView, clickedButtonAtIndex);
end;

procedure TAlertViewDelegate.alertViewCancel(alertView: UIAlertView);
begin
end;
Die Anwendung sieht folgendermaßen aus:
Delphi-Quellcode:
var alert: UIAlertView;
    alertTextField: UITextField;
    AlertDelegate: TAlertViewDelegate;
begin
 AlertDelegate:= TAlertViewDelegate.Construct(
  procedure(alertView: UIAlertView; clickedButtonAtIndex: NSInteger)
  var InputText: String;
  begin
   InputText:= NSSTRToString(TNSString.Wrap(TUITextField.Wrap(alertView.textFieldAtIndex(0)).Text));
   if not Empty(InputText) then
    FController.Test(InputText);
  end);

 alert:= TUIAlertView.Create;
 alert.setTitle(NSStr('MsgBos'));
 alert.setMessage(NSStr('Test'));
 alert.setAlertViewStyle(UIAlertViewStylePlainTextInput);
 alert.setCancelButtonIndex(alert.addButtonWithTitle(NSStr('OK')));
 alert.setCancelButtonIndex(alert.addButtonWithTitle(NSStr('Abbrechen')));
 alert.setDelegate(AlertDelegate.GetObjectID);
 alert.show;
 alert.release;
Wenn ich dann die MessageBox schließe, schmiert die App ab. Wenn der Inhalt von der anonymen Methode aber direkt im alertView() steht, funktioniert alles einwandfrei.

Irgendwelche Ideen?

Viele Grüße
Croco

Union 16. Mär 2014 18:44

AW: UIAlertViewDelegate und anonyme Mehtoden
 
Weak?

Crocotronic 16. Mär 2014 19:11

AW: UIAlertViewDelegate und anonyme Mehtoden
 
Speicher die Delegates jetzt einfach in einem Array in der Klasse, danke für den Hinweis! :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz