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