UITextField inputView 在 Swift 中不起作用

Posted

技术标签:

【中文标题】UITextField inputView 在 Swift 中不起作用【英文标题】:UITextField inputView is not working in Swift 【发布时间】:2014-08-13 08:30:08 【问题描述】:

我正在尝试将inputViewinputAccessoryView 设置为UITextField。但是,当我开始点击 textField 时,只有 inputAccessoryView 来自底部。

以下是我的代码:

@IBOutlet weak var pickerView: UIPickerView!
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var toolBar: UIToolbar!

override func viewDidLoad() 
    super.viewDidLoad()
    self.textField.inputView = self.pickerView;
    self.textField.inputAccessoryView = self.toolBar;

提前致谢。

【问题讨论】:

检查pickerView 框架是否设置正确。如果是零宽高可能会导致隐形。 @Keenle pickerView 已在 Xib 中连接。我检查了pickerView的框架,它不是零。 【参考方案1】:

当我看到这样的错误时,我真的很惊讶!您的代码看起来 100% 有效并且必须有效。我什至创建了一个小项目来重现这个问题。并成功繁殖。

所以我的步骤是:

    在 Xib 中使用 UITextView 创建简单项目,并在 application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) 中实例化。运行并查看默认键盘是否显示。

    向 Xib 添加另外两个视图并将它们连接到 MyViewController。并像你一样在viewDidLoad 中设置inputViewaccessoryInputView

    运行并查看问题。

答案从这里开始:

然后我刚刚重置了模拟器,清理了构建文件夹并再次运行代码。它按预期工作!

在我看来,它就像 xCode 或模拟器(或两者兼有)的错误,但我不能说谁有罪以及为什么。

屏幕截图(用按钮查看是我的键盘:)

【讨论】:

可以确认。转载。我以为我快疯了。代码完全正确,突然 UIPickerView 只显示了 inputAccessoryView。我很高兴我发现这个来验证我的理智。【参考方案2】:

事实证明,答案要简单得多。如果您使用硬件键盘而不是软键盘,模拟器将打开其“连接硬件键盘”设置,您将不再获得软键盘。建议重置您的模拟器的原因是因为它也会重置此设置。如果您不想完全重置,只需通过以下方式关闭硬件键盘:

硬件 -> 键盘 -> 并确保未选中“连接硬件键盘”

【讨论】:

【参考方案3】:

您可以通过编程方式创建该视图。

weak var pickerView: UIPickerView!
weak var toolBar: UIToolbar!
@IBOutlet weak var textField: UITextField!

override func viewDidLoad() 
    super.viewDidLoad()
    var picker = UIPickerView()
    picker.delegate = self
    picker.dataSource = self
    self.pickerView = picker
    self.textField.inputView = pickerView

    var toolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 44))

    var item = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done,
        target: self, action: "doneAction")

    toolbar.setItems([item], animated: true)
    self.textField.inputAccessoryView = toolbar
    self.toolBar = toolbar


func doneAction() 
    self.textField.resignFirstResponder()
    println("done!")

【讨论】:

为什么要以编程方式创建视图?我已经在 XIB 中创建了它。【参考方案4】:

这对我有用,因为设置 inputView 将视图添加到情节提要,但没有任何外观设置起作用并且 viewDidLoad() 没有被调用。

self.inputText?.inputViewController?.view.addSubview(self.basicKeyboard) self.inputText!.inputView = self.basicKeyboard self.inputText!.inputAccessoryView = nil

【讨论】:

【参考方案5】:
    确保在视图中覆盖 canBecomeFirstResponder 控制器并返回真。 (默认为假) 覆盖视图控制器中的inputAccessoryView 属性 并返回您选择的视图。 注意:确保您 在返回之前将其从其超级视图中删除。 (但它可以是一个 在 IB 中创建并通过插座链接的视图)

【讨论】:

以上是关于UITextField inputView 在 Swift 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UITextField InputView 需要一个完成按钮

UITextField InputView需要一个完成按钮

UITableView 中的 UITextField 与 DatePicker 的 InputView

在 UITableView 重新加载时以编程方式打开/关闭 UITextField 的 inputView

UIPickerView 作为多个 UITextField 的 inputView

UITableView 作为 UITextField didSelectRowAtIndexPath 的 inputView 随机未触发