使用 UITextField + UIPickerview 时禁用键盘输入

2023-12-04

这个项目也是点击textfield pickerview打开,但是上面显示的数据可以在该部分中输入。我怎样才能将其关闭?所以请看下面我的选择。

view image

如果单击文本字段,我将打开选择器视图:

import UIKit
import NVActivityIndicatorView

struct kategoriData {
    var text : String?
    var id : String?
}

class KonuEkleViewController: UIViewController,UITextFieldDelegate , NVActivityIndicatorViewable , UIPickerViewDataSource , UIPickerViewDelegate{
    @IBOutlet weak var txtBaslik: UITextField!
    @IBOutlet weak var txtYazi: UITextView!
    @IBOutlet weak var txtLink: UITextField!
    @IBOutlet weak var btnKonuAc: UIButton!
    @IBOutlet weak var txtKategoriSecimi: UITextField!

    let size = CGSize(width: 30, height: 30)
    let singleton = Global.sharedGlobal
    let ConnectString = Connect.ConnectInfo
    var kategoriList = [kategoriData]()
    let GirisView = GirisViewController()
    var secilenKategori : String?

    var dbKategoriIsim : String?
    var dbKategoriId:String?

    override func viewDidLoad() {
        super.viewDidLoad()
        txtKategoriSecimi.text = "Kategoriyi Seçiniz"
        KategoriGetir()
        pickerGrafik()
        txtYazi.layer.cornerRadius = 10
        btnKonuAc.layer.cornerRadius = 10

        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(GirisViewController.dismissKeyboard))
        view.addGestureRecognizer(tap)
    }
    func dismissKeyboard() {
        view.endEditing(true)
    }


    @IBAction func btnKonuEkle(_ sender: Any) {
       GirisView.LoadingIcon(tur: 0)
        if txtBaslik.text != "" && txtYazi.text != "" && secilenKategori != nil && txtKategoriSecimi.text != "Kategoriyi Seçiniz"
        {
            KonuEkle(uye: singleton.username, baslik: txtBaslik.text!, mesaj: txtYazi.text, kategori: secilenKategori!, link: txtLink.text!)
        }
        else
        {
            GirisView.Bildiri(baslik: "UYARI", mesaj: "Boş Alanları Doldurunuz", tur: 1)
        }
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1.0) {
            self.GirisView.LoadingIcon(tur: 1)
        }

    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }
    func KonuEkle(uye:String , baslik:String ,mesaj:String , kategori:String , link:String)
    {
        var request = URLRequest(url: URL(string:ConnectString.conString + "/KonuEkle")!)
        request.httpMethod = "POST"
        var postString = "uye="+uye+"&&baslik="+baslik+"&&mesaj="+mesaj+"&&kategori="+kategori+"&&link="+link
        postString = postString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
        request.httpBody = postString.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in

            if error != nil
            {
                print("error")
            }

            if let urlContent = data
            {

                do
                {
                    let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
                    print(jsonResult)
                    if let gelenDizi = jsonResult as? NSArray
                    {
                        for i in 0..<gelenDizi.count
                        {
                            if let gelenMesaj = (gelenDizi[i] as? NSDictionary)?["mesaj"] as? String
                            {
                                DispatchQueue.main.async {
                                    self.Sonuc(mesaj:gelenMesaj)
                                }

                            }

                        }

                    }


                }
                catch
                {
                    print("server hatası")
                }
            }
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1.0) {
                self.GirisView.LoadingIcon(tur: 1)
            }
        }
        task.resume()
    }


    func Sonuc(mesaj:String)
    {
        var mesajSonuc = ""
        var mesajBaslik = ""

        if mesaj == "basarili"
        {
            mesajSonuc = "Konu Açıldı"
            mesajBaslik = "Bilgi"
        }
        else
        {
            mesajSonuc = "Bir Hata Oluştu Lütfen Destek Bölümünden Bize Ulaşın"
            mesajBaslik = "Uyarı"
        }

        let appearance = SCLAlertView.SCLAppearance(showCloseButton: false)
        let alert = SCLAlertView(appearance: appearance)
        _ = alert.addButton("Tamam") {

            self.txtLink.text = ""
            self.txtYazi.text = ""
            self.txtBaslik.text = ""
            self.navigationController!.popViewController(animated: true)
        }
        if mesajBaslik == "Bilgi"
        {
        _ = alert.showSuccess(mesajBaslik, subTitle:mesajSonuc)
        }
        else
        {
        _ = alert.showNotice(mesajBaslik, subTitle:mesajSonuc)
        }

    }
        func pickerGrafik()
    {
        let pickerView = UIPickerView()

        pickerView.delegate = self

        txtKategoriSecimi.inputView = pickerView

        let toolBar = UIToolbar(frame: CGRect(x: 0, y: self.view.frame.size.height/6, width: self.view.frame.size.width, height: 40.0))

        toolBar.layer.position = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height-20.0)

        toolBar.barStyle = UIBarStyle.blackTranslucent

        toolBar.tintColor = UIColor.white

        toolBar.backgroundColor = UIColor.black


        let defaultButton = UIBarButtonItem(title: "İptal", style: UIBarButtonItemStyle.plain, target: self, action: #selector(KonuEkleViewController.tappedToolBarBtn))

        let doneButton = UIBarButtonItem(title: "Tamam", style: UIBarButtonItemStyle.done, target: self, action: #selector(KonuEkleViewController.donePressed))

        let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: self, action: nil)

        let label = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width / 3, height: self.view.frame.size.height))

        label.font = UIFont(name: "Helvetica", size: 12)

        label.backgroundColor = UIColor.clear

        label.textColor = UIColor.white

        label.text = "Kategoriyi Seçiniz"

        label.textAlignment = NSTextAlignment.center

        let textBtn = UIBarButtonItem(customView: label)

        toolBar.setItems([defaultButton,flexSpace,textBtn,flexSpace,doneButton], animated: true)

        txtKategoriSecimi.inputAccessoryView = toolBar
    }

    func donePressed(_ sender: UIBarButtonItem) {
        txtKategoriSecimi.resignFirstResponder()
    }

    func tappedToolBarBtn(_ sender: UIBarButtonItem) {

        txtKategoriSecimi.resignFirstResponder()
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return kategoriList.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return kategoriList[row].text
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        txtKategoriSecimi.text = kategoriList[row].text
        secilenKategori = kategoriList[row].id
    }

    func KategoriGetir()
    {
        kategoriList.removeAll()
        //SADECE 1 DEFA EKLENIYOR
        self.kategoriList.append(kategoriData.init(text: "Kategoriyi Seçiniz", id: "1"))
        GirisView.LoadingIcon(tur: 0)
        var request = URLRequest(url: URL(string:ConnectString.conString + "/KategoriGetir")!)
        request.httpMethod = "POST"
        var postString = "tur=1&&kategori="
        postString = postString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
        request.httpBody = postString.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in

            if error != nil
            {
                print("error")
            }

            if let urlContent = data
            {
                do
                {
                    let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
                    print(jsonResult)
                    if let gelenDizi = jsonResult as? NSArray
                    {
                        for i in 0..<gelenDizi.count
                        {

                            if let gelenKategori = (gelenDizi[i] as? NSDictionary)?["kategoriisim"] as? String
                            {
                                self.dbKategoriIsim = gelenKategori
                            }
                            if let gelenId = (gelenDizi[i] as? NSDictionary)?["id"] as? String
                            {
                                self.dbKategoriId = gelenId
                            }
                            self.kategoriList.append(kategoriData.init(text: self.dbKategoriIsim, id: self.dbKategoriId))

                        }

                    }



                }
                catch
                {
                    print("error")
                }
            }
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) {
                self.GirisView.LoadingIcon(tur: 1)
            }
        }
        task.resume()
    }


}

您可以实施UITextFieldDelegate method:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

回来false这样就可以防止手动输入任何字符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 UITextField + UIPickerview 时禁用键盘输入 的相关文章

随机推荐

  • 如何读取 SNMP OID 输出(位)(hrPrinterDetectedErrorState)

    我有一个快速的问题 这很可能是用户错误 所以在开始之前我深表歉意 我正在尝试为设备设置阈值 以便当我们的一台打印机处于某种状态时它会提醒我们 卡纸 碳粉用完 无纸等 我找到了处理此问题的特定 oid 1 3 6 1 2 1 25 3 5 1
  • readthedocs 不从公共 github 存储库创建文档

    我有一个公共 github 存储库 下列的指示在 readthedocs 中 我使用 Sphinx 以我很乐意让其他人看到的形式获取文档 编辑文件并重建 直到您喜欢所看到的内容为止 然后提交更改并推送到公共存储库 一旦您在公共存储库中拥有
  • 我在设置 MvvmCross 6.0 时做错了什么?

    我是 MvvmCross 6 0 和 Xamarin 的新手 我正在尝试遵循这里是 MvvmCrosss 5 5 的教程 我按照解释 创建 App xaml 作为 MvxFormsApplication
  • Google Chrome“后退”和“前进”历史记录

    我正在开发一个名为 的小扩展 标签捆绑器 简而言之 它将窗口中所有打开的选项卡保存到一个捆绑包中 只需单击按钮即可打开该捆绑包 但是 当打开捆绑包时 不会保存用户如何访问该 url 的历史记录 即用户无法点击返回查看他们如何到达该网址 这是
  • 项目级别的 SourceSafe 合并

    我正在运行 SourceSafe 并且我的代码有两个分支 我目前正在使用手动方法运行报告来显示差异 然后手动将每个文件一一合并 不过 我正在尝试找到一种简化的方法来在项目级别上做到这一点 如果该过程一次显示每个文件一个就可以了 我只是担心如
  • 将逗号分隔值拆分到具有固定列数的目标表中

    我在 Postgres 13 1 数据库中有一个包含单列的表 它由许多带有逗号分隔值的行组成 最多大约 20 个元素 我想将数据分成多列 但我的列数有限 例如单行中有 5 个和 5 个以上的 CSV 值 因此多余的值必须转移到新的 下一行
  • React Native:firestore/firebase 预期 collection() 的第一个参数是 CollectionReference...怎么样?

    因此 我有一个简单的 React Native 应用程序 它是我使用 Expo 创建的 并在我的个人 Android 设备上进行调试 我已将 firebase firestore 包含到我的应用程序中 现在尝试在单击按钮时将对象添加到 fi
  • 将 web.config 文件转换为 .htaccess

    我正在寻找一种将 IIS 重写规则转换为 htaccess 文件的方法 我找不到任何工具来自动执行此操作 我所能得到的只是 500 个内部服务器错误 web config 文件如下所示
  • 添加“Authorization”标头会导致 Spring Security 保护允许的端点

    所以 我的里面有这个WebSecurityConfigurerAdapter public class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdap
  • 如果 C# 中的相同位置已存在文件,则始终创建新文件

    我使用下面的代码创建了一个新文件 但如果该文件已经存在 那么我需要使用另一个文件名创建一个新文件 这可能吗 FileStream fs new FileStream filePath FileMode Append FileAccess W
  • 带等高线的 Gnuplot 、 pm3d

    我正在用一些值绘制一个矩阵 3D 并且我需要向图中添加等高线 是否有一个简单的 gnuplot 命令可以做到这一点 我尝试了命令 设置轮廓基础 但只出现了 1 行 我认为应该有很多行 看matlab图片 当我在 gnuplot 中绘制它时
  • R flextable - 如何在合并单元格下添加表宽水平边框

    当合并单元格时 是否有一种聪明的方法可以使水平边框表格变宽 在下面的示例中 它还不是表宽 或者我应该编写一个函数来计算正确的索引 library flextable library officer library dplyr myft lt
  • MySQL 查询查找订购了两种特定产品的客户

    我无法提出一个查询来查找同时购买了 PROD1 和 PROD2 的所有客户 这是一个伪查询 看起来像我想要做的 显然这是行不通的 SELECT COUNT DISTINCT userid FROM TRANSACTIONS WHERE pr
  • javascript - 如何让对象返回一个不是对象本身的值

    当创建一个x new Date 对象 如果你把它放入console log x 将输出一个字符串 有没有办法制作一个自定义对象 该对象将返回一个不是对象本身的不同值 有一个函数可以做到这一点 toString 但是如果你这样做console
  • 为 CakePHP 发送正确的 JSON 内容类型

    在我的 CakePHP 应用程序中 我返回 JSON 并针对某些请求退出 例如 尝试通过 GET 请求访问 API 进行登录 header Content Type application json echo json encode arr
  • Intellij Idea 13 有代码片段编辑器吗?

    Visual Studio 有片段设计师扩展可用于创建和管理自定义代码片段 是否有类似 Intellij Idea 13 的扩展 或者简单添加自定义代码片段的方法 据我所知 没有扩展 而且我不熟悉 Snippet Designer 但 In
  • 将 Guid 表示为一组整数

    如果我想将 guid 表示为一组整数 我将如何处理转换 我正在考虑获取 guid 的字节数组表示形式并将其分解为可以转换回原始 guid 的尽可能少的 32 位整数 首选代码示例 另外 生成的整数数组的长度是多少 由于 GUID 只有 16
  • 安装Python geopandas失败

    我正在尝试安装 geopandas 进行以下设置 Windows 64 Anaconda2 64 位 Python 2 7 尝试过两件事 1 pip install geopandas 这给了我以下错误 WindowsError Error
  • 在Python中使用win32com.client如何查找和替换多个文本

    我正在尝试使用查找和替换来将多个字符串值添加到 Word 文档中win32com客户端Python 库 我可以查找并替换一个值 但我不知道如何对多个值执行此操作 这是我到目前为止所拥有的 import win32com client wor
  • 使用 UITextField + UIPickerview 时禁用键盘输入

    这个项目也是点击textfield pickerview打开 但是上面显示的数据可以在该部分中输入 我怎样才能将其关闭 所以请看下面我的选择 如果单击文本字段 我将打开选择器视图 import UIKit import NVActivity