问题 防止文本字段中的自定义键盘


我正在尝试自定义键盘如何影响我的应用。我在iPhone 6上安装了Swype。

我发现在我的一些视图中,我在文本字段上设置了自定义inputView属性,Swype键盘覆盖并呈现而不是我的选择器。这完全打破了我的UI,不能被允许。

有没有办法明确告诉iOS 8只使用我设置的inputView?

这可能是一个错误吗?允许第三方覆盖我的输入规范是不是完全没有预期的行为?


2985
2017-09-24 15:34


起源

我正面临我的应用程序的确切问题。我尝试过多个自定义键盘,但问题无处不在。你有成功吗? - Tariq


答案:


以Pablo Ezequiel Romero的答案为出发点,我能够让事情为我工作。基本上,而不是使用 UIViewController 对于自定义键盘,请使用 UIInputViewController 把你的控件放在里面 UIInputViewControllerinputView。然后,分配 inputView 你的 UITextField 要么 UITextView 到了 inputView 的 UIInputViewController

如果您正在使用自动布局,则需要确保正确设置所有内容并确保在inputView上设置初始高度约束并将其优先级设置为低于最大999级别(我使用800)。任何高度都可以;系统将用自己的约束替换你的约束。较低的优先级避免了自动布局冲突。 (对我来说,如果我没有包含这个约束,那么最终视图根本不会有任何高度。)

当我完成所有这些操作后,我可以切换进出我的(应用内部)自定义键盘和任何第三方键盘扩展。


3
2017-07-27 18:46





您可以使用以下代码为应用禁用自定义键盘:

在您的app委托中包含此内容:

- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)extensionPointIdentifier {
    if ([extensionPointIdentifier isEqualToString: UIApplicationKeyboardExtensionPointIdentifier]) {
        return NO;
    }
    return YES;
}

6
2017-10-01 19:53



谢谢。这是很好的知识和潜在的解决方案。虽然有点沉重。用户可能会因为我的应用程序中缺少首选键盘而感到沮丧。没有理由在许多情况下不能使用自定义键盘,只有在我提供专用inputView的地方才会出现问题。 - Dean Davids
我自己偶然发现了这个问题,这就是问题。我的主要问题是登录视图,其中不允许自定义键盘设置密码,因此当用户从用户名字段点击“下一步”时,密码文本字段从不显示键盘。 (因此,如果您还有一个登录或安全文本输入文本字段,请使用swype进行测试,以查看它是否也不会破坏您的UI) - eertl
@eertl:我有另一个问题。我知道我们将能够使用上面的代码片段禁用自定义iOS 8键盘。这里重点是我们需要使用Xcode-6 / iOS 8 SDK来使用上面的内容。由于其他一些限制,我仍然在Xcode 5上。有什么方法可以防止使用iOS 7 SDK / Xcode 5的第三方键盘?请帮忙。 - Rashmi Ranjan mallick
1)上面的答案就是你第一次问@DeanDavids,你可以接受它:) 2)如果使用Xcode 5和SDK7,第三方键盘将不起作用 - TonyMkenu
@TonyMkenu我的愿望更倾向于防止覆盖inputView,或者更具体地说,是针对单个文本字段的自定义选择器。这实际上似乎已在已发布的iOS8版本中得到修复,因此不再是问题。我会接受答案,因为完全禁用用户选择的副作用,我觉得这是不可接受的。 - Dean Davids


我有一个类似的问题,我能够使用UIInputViewController修复它。基本上我在inputView中设置的视图是我的UIInputViewController子类的视图。我正在使用UIViewController,但在更换基本视图控制器后,它开始运行良好。


1
2018-03-01 16:08



巴勃罗,我从来没有完全解决这个问题。可以更清楚一点。我完全不明白你做了什么。 - Dean Davids


斯威夫特4

  func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplicationExtensionPointIdentifier) -> Bool {
        if (extensionPointIdentifier == .keyboard) {
            return false
        }
        return true
    }

0
2017-08-19 05:51