在swift中禁用UITextfield的用户输入

时间:2015-04-22 08:21:25

标签: ios swift uitextfield editing

我知道,这是一个非常微不足道的问题。但我在网上找不到任何东西。

我需要禁止用户编辑文本字段内的文本。因此,当单击文本时,键盘不会显示。

有什么想法吗?

一个程序化的解决方案,或者如果可以通过故事板,那就太棒了。

8 个答案:

答案 0 :(得分:83)

试试这个:

Swift 2.0

textField.userInteractionEnabled = false

Swift 3.0

textField.isUserInteractionEnabled = false

或在故事板中取消选中"启用用户交互"

enter image description here

答案 1 :(得分:37)

另一个解决方案,将您的控制器声明为UITextFieldDelegate,实现此回调:

@IBOutlet weak var myTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    myTextField.delegate = self
}

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    if textField == myTextField {
        return false; //do not show keyboard nor cursor
    }
    return true
}

答案 2 :(得分:2)

我喜欢像过去那样做。您只需使用这样的自定义UITextField类:

//
//  ReadOnlyTextField.swift
//  MediFormulas
//
//  Created by Oscar Rodriguez on 6/21/17.
//  Copyright © 2017 Nica Code. All rights reserved.
//

import UIKit

class ReadOnlyTextField: UITextField {

    /*
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
    }
    */

    override init(frame: CGRect) {
        super.init(frame: frame)

        // Avoid keyboard to show up
        self.inputView = UIView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        // Avoid keyboard to show up
        self.inputView = UIView()
    }

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        // Avoid cut and paste option show up
        if (action == #selector(self.cut(_:))) {
            return false
        } else if (action == #selector(self.paste(_:))) {
            return false
        }

        return super.canPerformAction(action, withSender: sender)
    }

}

答案 3 :(得分:2)

如果要在保持用户交互的同时执行此操作。 就我而言,我正在使用(或更确切地说是滥用)isFocused

self.myField.inputView = UIView()

这样,它将聚焦,但键盘不会显示。

答案 4 :(得分:0)

如果您不希望用户能够修改UILabel中的任何内容,则可以使用UITextField

程序化解决方案是使用enabled属性:

yourTextField.enabled = false

在故事板中进行此操作的方法:

取消选中UITextField

属性中的已启用复选框

enter image description here

答案 5 :(得分:0)

Swift 4.2 / Xcode 10.1:

只需在情节提要->属性检查器中取消选中行为已启用

答案 6 :(得分:0)

您应该使用“ isEditable” 而不是“ userInteractionEnabled”,因为如果UITextfield的行数多了,那么您看到的行就可以滚动了。 “ userInteractionEnabled”将不适用于滚动。

快捷键4

textView.isEditable = false

答案 7 :(得分:0)

在Swift 5中,我使用以下代码禁用了文本字段

import tkinter as tk
from tkinter import ttk

root=tk.Tk()
root.geometry("500x500")
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)

lasth = -1

def rsz(event):
    global lasth
    #h = root.winfo_height()
    h = event.height
    if h != lasth:
        for widget in frame.winfo_children():
            widget.destroy()
        for row in range(h//26):
            frame.grid_rowconfigure(row, weight=1)
            for col in range(6):
                ttk.Button(frame, text='row{}, col{}'.format(row,col)).grid(row=row, column=col, sticky='nsew')
        lasth = h

frame=tk.Frame(root, padx=5, pady=5)
frame.grid(row=0, column=0, sticky="nsew")
# since number of columns does not change
# grid_columnconfigure() can be called once for each column
for col in range(6):
    frame.grid_columnconfigure(col, weight=1)
frame.bind("<Configure>", rsz)

root.mainloop()