Einzelnen Beitrag anzeigen

Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#1

UIAlertViewDelegate und anonyme Mehtoden

  Alt 16. Mär 2014, 15:29
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
  Mit Zitat antworten Zitat