【问题标题】:Swift - Tap gesture to dismiss keyboard UITableViewSwift - 点击手势以关闭键盘 UITableView
【发布时间】:2015-05-25 14:01:43
【问题描述】:

我有一个与 this one 相同的问题,但由于我是编程新手,而且只知道 swift,所以我想知道是否有人可以在 swift 中给我它的等价物。或者指出我可能很快错过的另一个问题。

谢谢!

更新:这是我的视图控制器的基本要点,在我削减了一些脂肪以仅处理相关主题之后。重述问题。直到我单击“doneButton”以运行 createClient() 函数并导航回客户端页面以编辑新创建的客户端后,点击手势才能关闭键盘。

import UIKit
import CoreData
import Foundation

class NewClientTableViewController: UITableViewController, UINavigationControllerDelegate, UITextFieldDelegate {

let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext

@IBOutlet weak var nameTxt: UITextField!
@IBOutlet weak var ageTxt: UITextField!
@IBOutlet weak var phoneTxt: UITextField!
@IBOutlet weak var emailTxt: UITextField!
@IBOutlet weak var heightTxt: UITextField!
@IBOutlet weak var notesTxt: UITextView!

var client: Client? = nil

override func viewDidLoad() {
    super.viewDidLoad()

    if client != nil {

        nameTxt.text = client?.name
        ageTxt.text = client?.age
        heightTxt.text = client?.height
        phoneTxt.text = client?.phone
        emailTxt.text = client?.email
        notesTxt.text = client?.notes

        self.title = client?.name
        phoneTxt.delegate = self

        let tapGesture = UITapGestureRecognizer(target: self, action: Selector("hideKeyboard"))
        tapGesture.cancelsTouchesInView = true

        tableView.addGestureRecognizer(tapGesture)

    }
}

func hideKeyboard() {
    tableView.endEditing(true)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func doneButton(sender: AnyObject) {
    if client != nil {
        editClient()
    } else {
        createClient()
    }
    dismissViewController()

}

func editClient() {

    client?.name = nameTxt.text
    client?.age = ageTxt.text
    client?.height = heightTxt.text
    client?.phone = phoneTxt.text
    client?.email = emailTxt.text
    client?.notes = notesTxt.text
    client?.clientImage = UIImageJPEGRepresentation(contactImage.image, 1)

    managedObjectContext?.save(nil)
}

func createClient() {

    let entityDescription = NSEntityDescription.entityForName("Client", inManagedObjectContext: managedObjectContext!)
    let client = Client(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext)

    if nameTxt.text == "" {
        client.name = "Untitled Client"
    } else {
        client.name = nameTxt.text
    }

    client.age = ageTxt.text
    client.height = heightTxt.text
    client.phone = phoneTxt.text
    client.email = emailTxt.text
    client.notes = notesTxt.text

    client.clientImage = UIImageJPEGRepresentation(contactImage.image, 1)

    managedObjectContext?.save(nil)

}

func dismissViewController() {
    navigationController?.popToRootViewControllerAnimated(true)
    }
}

【问题讨论】:

    标签: uitableview swift uitapgesturerecognizer


    【解决方案1】:

    接受的答案在 XCode 13.1 上对我不起作用,所以我稍微更改了代码:

    override func viewDidLoad() {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.hideKeyboard))
        tapGesture.cancelsTouchesInView = true
        tableView.addGestureRecognizer(tapGesture)
    }
    
    @objc func hideKeyboard() {
        tableView.endEditing(true)
    }
    

    【讨论】:

      【解决方案2】:

      Swift 4:

      在 ViewDidLoad 上:

          override func viewDidLoad() {
              super.viewDidLoad()
      self.yourTableView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:))))
      
          }
      

      关于相应功能:

      @objc func handleTap(_ sender: UITapGestureRecognizer) {
          if sender.state == .ended {
              // Do your thang here!
              self.view.endEditing(true)
              for textField in self.view.subviews where textField is UITextField {
                  textField.resignFirstResponder()
              }
          }
          sender.cancelsTouchesInView = false
      }
      

      【讨论】:

        【解决方案3】:

        正如@Ben 已经推荐的那样,您也可以通过编程方式执行此操作。 把它放在你的 viewDidLoad() 中

        tableView.keyboardDismissMode = .onDrag
        

        【讨论】:

          【解决方案4】:

          覆盖 func viewDidLoad() { super.viewDidLoad()

              let tapGesture = UITapGestureRecognizer(target: self, action: Selector("hideKeyboard"))
              tapGesture.cancelsTouchesInView = true
              self.view.addGestureRecognizer(tapGesture)
          }
          
          
          func hideKeyboard()
          {
              self.view.endEditing(true)
          }
          

          与上面对我不起作用的方法相比,这会很好用

          【讨论】:

          • 您的答案与接受的答案有何不同?尽管它缺乏一些好的格式和详细的解释?
          【解决方案5】:

          由于某种原因,@Isuru 的答案在我的应用程序 (XCode 7.2.1) 中崩溃了,幸好这只是一个小改动 - 只需删除 Selector() 调用:

          override func viewDidLoad() {
              super.viewDidLoad()
          
              let tapGesture = UITapGestureRecognizer(target: self, action: "hideKeyboard")
              tapGesture.cancelsTouchesInView = true
              tableView.addGestureRecognizer(tapGesture)
          }
          
          func hideKeyboard() {
              tableView.endEditing(true)
          }
          

          【讨论】:

            【解决方案6】:

            您也可以从 Storyboard 中执行此操作:

            【讨论】:

            • 非常感谢您。其他解决方案,至少我用手势识别器尝试过的一个解决方案阻止我选择一个连接到另一个视图的表格单元格。手势将取消触摸。
            • 上面提到过,但有一个针对 @JozemiteApps 的修复 - tapGesture.cancelsTouchesInView = true
            • 谢谢。网络上有这么多答案,过于复杂,但你是唯一一个说出明显方式的人。
            • 这个我不知道存在。谢谢。
            【解决方案7】:
            override func viewDidLoad() {
                super.viewDidLoad()
            
                let tapGesture = UITapGestureRecognizer(target: self, action: Selector("hideKeyboard"))
                tapGesture.cancelsTouchesInView = true
                tableView.addGestureRecognizer(tapGesture)
            }
            
            func hideKeyboard() {
                tableView.endEditing(true)
            }
            

            将 Objective-C 代码翻译成 Swift 并不难。您只需要两种语言的基本知识。如果您是编程新手,我想您应该先熟悉基础知识。

            【讨论】:

            • 我需要以这种方式连接我的手势识别器吗?
            • 好的,开始工作了。但是为什么在我真正保存我的联系人之前它不起作用(我的应用程序中有一个联系表)。我必须进去编辑联系人才能正常工作。
            • 用这么少的信息很难说。请详细说明。也许用更多信息和到目前为止的代码更新您的原始问题。
            • 哦,伙计。我刚刚解决了。直到我发布编辑后,我才意识到 tapGesture 在我的 if client != nil 语句中。把它带到 viewDidLoad 外面,现在效果很好。我一定累了... :) 再次感谢。
            • 我认为:tapGesture.cancelsTouchesInView = false
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多