Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ISSUE-006

虚幻引擎打不了字

常见表现

启用按键映射的情况下,打不了字。

相关源码

虚幻引擎 IOSView.h

@interface FIOSView : UIView <UIKeyInput, UITextInput>
{
	//... 
}

PlayTools ControlMode.swift

if PlaySettings.shared.noKMOnInput {
	NotificationCenter.default.addObserver(forName: UITextField.textDidEndEditingNotification, object: nil, queue: .main) { _ in
		ModeAutomaton.onUITextInputEndEdit()
	}
	NotificationCenter.default.addObserver(forName: UITextField.textDidBeginEditingNotification, object: nil, queue: .main) { _ in
		ModeAutomaton.onUITextInputBeginEdit()
	}
}

原因分析

目前PlayCover的智能按键映射只会监听UITextFieldUITextView的开始输入、停止输入事件。

但虚幻引擎启用Use Integrated Keyboard后,文本输入将不会调用UITextField,而是直接通过UIKeyInput接口实现,也就不会产生UITextField的相关事件广播。

解决方法

临时解决方法:

右键游戏图标 - 设置 - 键盘映射设置,禁用“按键映射布局” 或 禁用“智能按键映射”。

临时修复代码:

PlayTools NSObject+Swizzle.m

手动发送相关事件广播。

- (BOOL)hook_FIOSView_becomeFirstResponder {
    BOOL ret = [self hook_FIOSView_becomeFirstResponder];
    [[NSNotificationCenter defaultCenter] postNotificationName:UITextFieldTextDidBeginEditingNotification
                                                        object:nil];
    return ret;
}

- (BOOL)hook_FIOSView_resignFirstResponder {
    BOOL ret = [self hook_FIOSView_resignFirstResponder];
    [[NSNotificationCenter defaultCenter] postNotificationName:UITextFieldTextDidEndEditingNotification
                                                        object:nil];
    return ret;
}

[objc_getClass("FIOSView") swizzleInstanceMethod:@selector(becomeFirstResponder) withMethod:@selector(hook_FIOSView_becomeFirstResponder)];
[objc_getClass("FIOSView") swizzleInstanceMethod:@selector(resignFirstResponder) withMethod:@selector(hook_FIOSView_resignFirstResponder)];