iOS를 사용할 때 Delphi에서 가상 키보드의 "완료"버튼을 어떻게 감지합니까? 가상 키보드를 닫은 오른쪽 위 모서리에있는 버튼입니다.Delphi iOS - 완료 버튼의 KeyDown 감지
답변
내 의견에 따라 FMX.VirtualKeyboard.iOS 단위를 수정해야합니다.
unit VirtualKeyboardMessages;
interface
uses
System.Messaging;
type
TVirtualKeyboardDoneClickedMessage = class(TMessage);
implementation
end.
이 FMX.VirtualKeyboard.iOS의 복사본을 만들고 프로젝트에 저장 :
가 TMessage 자손을 정의하기위한 장치, 예를 만듭니다 :이 단계는 솔루션에 당신에게 대부분의 방법이 있어야합니다 폴더. 그런 다음
procedure TCocoaVirtualKeyboardService.RefreshToolbarButtons;
var
I: Integer;
B: UIBarButtonItem;
AutoReleasePool: NSAutoReleasePool;
begin
// code snipped for brevity, and to avoid copyright issues
//Hide button
if FHideButton = nil then
begin
FHideButton := TUIBarButtonItem.Create;
FHideButton.setTitle(StrToNSStr(SEditorDone));
FHideButton.setStyle(UIBarButtonItemStyleDone);
FHideButton.setTarget(FKeyboardHandler.GetObjectID);
// Following line commented out from original code:
// FHideButton.setAction(sel_getUid('HideVirtualKeyboard'));
// Following line added:
FHideButton.setAction(sel_getUid('DoneButtonClicked'));
end;
// code snipped for brevity, and to avoid copyright issues
end;
:
IKeyboardEvents = interface(NSObject)
['{72D3A7FD-DDE3-473D-9750-46C072E7B3B7}']
// code snipped for brevity, and to avoid copyright issues
// Add this method
procedure DoneButtonClicked; cdecl;
end;
TKeyboardEventHandler = class(TOCLocal)
strict private type
TKeyboardState = (Shown, Hidden);
private
FKeepFocus: Boolean;
// code snipped for brevity, and to avoid copyright issues
// Add this method
procedure DoneButtonClicked; cdecl;
end;
procedure TKeyboardEventHandler.DoneButtonClicked;
begin
HideVirtualKeyboard;
TMessageManager.DefaultManager.SendMessage(Self, TVirtualKeyboardDoneClickedMessage.Create);
end;
가 RefreshToolbarButtons 방법을 수정
implementation
uses
System.Classes, System.SysUtils, System.TypInfo, System.Generics.Collections, System.UITypes, System.Types,
System.Messaging, System.Math, Macapi.ObjectiveC, Macapi.ObjCRuntime, Macapi.Helpers,
iOSapi.CocoaTypes, iOSapi.Foundation, iOSapi.UIKit, iOSapi.CoreGraphics,
FMX.Types, FMX.VirtualKeyboard, FMX.Platform, FMX.Forms, FMX.Platform.iOS, FMX.Consts, FMX.Helpers.iOS,
// Add this to the uses clause
VirtualKeyboardMessages;
가 IKeyboardEvents 인터페이스와 TKeyboardEventHandler 클래스에 DoneButtonClicked 방법을 추가 : 위의 장치, 예를 포함하는 장치를 수정 위의 VirtualKeyboardMessages 유닛을 사용해야하는 양식의 TVirtualKeyboardDoneClickedMessage에 가입해야합니다. 나는 그것을 당신을위한 운동으로 남겨 둘 것입니다. 양식에 하나의은 TEdit이있는 경우
이 메서드에 대한 주석 처리의 이유 FHideButton.setAction (sel_getUid ('HideVirtualKeyboard')); – Acid
DoneButtonClicked 메서드가이를 대체하기 때문에 –
uses VirtualKeyboardMessages;
type
TMainForm = class(TForm)
{...}
private
{ Private declarations }
MessageManager: TMessageManager;
SubscriptionId: Integer;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
MessageManager := TMessageManager.DefaultManager;
SubscriptionId := MessageManager.SubscribeToMessage(TVirtualKeyboardDoneClickedMessage, procedure(const Sender: TObject; const M: TMessage)
begin
ShowMessage('Done');
end);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
TMessageManager.DefaultManager.Unsubscribe(TVirtualKeyboardDoneClickedMessage, SubscriptionId);
end;
는 // 현재 좋은 솔루션입니다. 그러나 당신은 여러 개 있다면 문제가 있습니다. 그리고 당신이 "Showmessage"이 시각적 대화 상자를 사용한다면 가상 키보드가 숨어 있지 않습니다.
여러 번 편집하면 왜 문제가됩니까? 또한 Done을 클릭했을 때 왜 ShowMessage를 사용하고 있습니까? –
어떤 종류의 TEdit가 결정되지 않기 때문에. webbrowse ("done"then webbrowser.navigate (edit.text);)에 대해 "done capture"를 사용하지만 웹 페이지가 편집되고 다시 "done"을 탭하면 같은 이벤트가 다시 호출됩니다. Showmessage 또는 simular 유일한 방법은 사용자와 통신 할 수 있습니다. – Acid
IsFocused를 사용하여 편집에 포커스가 있는지 여부를 확인할 수 있습니다. 더 나아가 ActiveControl 속성을 사용하여 포커스가 무엇인지 정확하게 확인하십시오. 사용자가 '완료'를 탭한 이유는 무엇입니까? –
TForm의 OnVirtualKeyboardHidden 이벤트를 사용하십시오. 사용자가 완료 버튼을 탭했는지 또는 다른 이유로 숨겨져 있는지 여부는 중요하지 않습니다. 동일한 코드가 호출됩니다. –
다른 방법이있을 수 있지만 FMX.VirtualKeyboard.iOS에서 코드를 수정해야하므로 피할 수 있습니다. 대안이있을 수 있기 때문에 Done 버튼이 눌려지는 것을 감지 할 이유를 정확히 설명하는 데 도움이 될 수 있습니다. (대체 포커스가 없거나 다른 컨트롤과 대조적으로) –
항상 "완료"버튼을 탭합니다. 행동의 끝. 나는 사용자가 같은 것을 기대한다고 생각한다. – Acid