web-dev-qa-db-ja.com

Swift-ジェスチャーをタップしてキーボードUITableViewを閉じます

これ と同じ質問がありますが、プログラミングは初めてで、本当に知っているだけなのでSwift誰かが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)
    }
}
11
Leighton
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に翻訳するのはそれほど難しいことではありません。両方の言語の基本的な知識が必要です。プログラミングに慣れていない場合は、最初に基本に慣れておく必要があります。

24
Isuru

ストーリーボードからも実行できます。

enter image description here

30
Ben

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)
}

これは私にとってはうまくいかなかった上記と比較してうまくいくでしょう

2
Ullas Kumar

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
}
2
A.G

@Benがすでに推奨しているように、これはプログラムで行うこともできます。これをviewDidLoad()に入れるだけです

tableView.keyboardDismissMode = .onDrag
1
phitsch

何らかの理由で、@ 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)
}
1
StrangeCode