为啥我在 SwiftUI 中的 TextEditor 会忽略我的 .keyboardType?

Posted

技术标签:

【中文标题】为啥我在 SwiftUI 中的 TextEditor 会忽略我的 .keyboardType?【英文标题】:Why does my TextEditor in SwiftUI ignore my .keyboardType?为什么我在 SwiftUI 中的 TextEditor 会忽略我的 .keyboardType? 【发布时间】:2020-09-25 09:42:09 【问题描述】:

我正在尝试在 SwiftUI 中使用 TextEditor(),并且需要 .keyboardType(.numberPad)。不幸的是,每当我设置此选项时,出于某种原因,我的设备和模拟器似乎完全忽略了它!无论我设置什么键盘选项,它都只显示默认键盘。

有人知道为什么会这样吗?我已经使用 Xcode 12 Beta 2 测试了 ios 14.0 和 14.2 Beta。

【问题讨论】:

我在尝试使用 .twitter 键盘时遇到了同样的问题。这似乎是 TextEditor 的问题,因为它适用于 TextField。如果您的号码不是多行,那么 TextField 对您来说可以吗? 当我希望我太愚蠢而无法正确使用它。我现在可以使用 TextField,但 TextEditor 会好很多,因为它在 Form 内提供了更大的命中框。不过感谢您的回答。意味着我不是唯一一个,这可能是苹果方面的一个错误。希望他们能尽快解决。 :) 【参考方案1】:

这是一个使用SwiftUI-Introspect的丑陋解决方法

(FB8816771 是我使用 Apple 记录的反馈 ID。)

private extension View 
    func keyboardType_FB8816771(_ type: UIKeyboardType) -> some View 
        let customise: (UITextView) -> () =  uiTextView in
            uiTextView.keyboardType = type
        
        
        return introspect(selector: TargetViewSelector.siblingContaining, customize: customise)
    

【讨论】:

【参考方案2】:

如果这对 TextEditor 没有“完成”按钮这一事实的任何人有所帮助...扩展上面 Luke Howard 的答案...

import Introspect

extension View 
    func addDoneButton() -> some View 
        let helper = MainViewHelper()
        
        let customise: (UITextView) -> () =  uiTextView in
            let toolBar = UIToolbar(frame: CGRect(x: 0.0,
                                                  y: 0.0,
                                                  width: UIScreen.main.bounds.size.width,
                                                  height: 44.0))//1
            let flexible = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
            let barButton = UIBarButtonItem(title: "Done", style: .plain, target: uiTextView, action: #selector(helper.close))
            toolBar.setItems([flexible, barButton], animated: false)//4
            uiTextView.inputAccessoryView = toolBar
            uiTextView.keyboardAppearance = .light
        
        
        return introspect(selector: TargetViewSelector.siblingContaining, customize: customise)
    


class MainViewHelper 
    @objc func close() 
        
    

【讨论】:

以上是关于为啥我在 SwiftUI 中的 TextEditor 会忽略我的 .keyboardType?的主要内容,如果未能解决你的问题,请参考以下文章

自定义属性包装器无法准确反映我在 SwiftUI 中的 TextField 的状态,知道为啥吗?

为啥单击 SwiftUI 中的列表项后列表视图项变为灰色?

为啥我不能访问这个数组 ForEach 循环中的数据? SwiftUI

为啥嵌入到 SwiftUI 表单中的按钮不起作用?

为啥导航栏中的 SwiftUI TextField 一次只接受输入一个字符

SwiftUI,为啥部分视图没有刷新? @State 变量未更新