использовать делегат текстового поля, чтобы ответить на немедленное изменение текстового поля - PullRequest
0 голосов
/ 17 января 2020

Мой быстрый код прямо сейчас делегат текстового поля, чтобы изменить то, что отображается в метке. Проблема в том, что метка изменяется только тогда, когда пользователь вводит число, а затем удаляет его. Как вы можете видеть в GIF ниже. Все, что я хочу сделать, - это когда пользователь вводит 1, потому что Ким Кардашьян появляется на этикетке. Прямо сейчас он делает это, но мне нужно 1, затем удалить его из текстового поля, и только тогда на ярлыке появится Ким Кардашьян.

enter image description here

  import UIKit
  import CoreData


 class ViewController: UIViewController,UITextFieldDelegate {
@IBOutlet var labelName : UILabel!
@IBOutlet var enterT : UITextField!

lazy var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

override func viewDidLoad() {
    super.viewDidLoad()

    openDatabse()


    enterT.delegate = self

}


func joke(at index : Int) {
    let fetchRequest = NSFetchRequest<Users>(entityName: "Users")
    fetchRequest.predicate = NSPredicate(format: "idx == %d", Int32(index))
    do {
        if let user = try context.fetch(fetchRequest).first {
            labelName.text = user.username
        }
    } catch {
        print("Could not fetch \(error) ")
    }
}
func openDatabse()
{
    let names = ["kim kardashian", "jessica biel", "Hailey Rienhart"]
    for i in 0..<names.count {
        let newUser = Users(context: context)
        newUser.username = names[i]
        newUser.idx = Int32(i + 1)
    }
    print("Storing Data..")
    do {
        try context.save()
    } catch {
        print("Storing data Failed", error)
    }
}


func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // return NO to not change text
    print("While entering the characters this method gets called")
    guard let index = Int(textField.text!) else {
         // display an alert about invalid text
         return true
     }
     joke(at: index )


    return true
}}

Ответы [ 3 ]

2 голосов
/ 17 января 2020

textField.text дает текст до внесения каких-либо изменений в textField =, т.е. ранее введенный text. Вам также нужно добавить replacementString. Это новый text, который вводится в textField.

Итак, UITextFieldDelegate метод textField(_: shouldChangeCharactersIn: replacementString) должен выглядеть так:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // return NO to not change text
    print("While entering the characters this method gets called")
    guard let text = (textField.text as? NSString)?.replacingCharacters(in: range, with: string), let index = Int(text) else { //here....
        // display an alert about invalid text
        return true
    }
    joke(at: index )
    return true
}
1 голос
/ 17 января 2020

Вы можете попробовать это,

textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

и

func textFieldDidChange(_ textField: UITextField) {

}
0 голосов
/ 17 января 2020

Если вы используете функцию touchesBegan() и делаете текстовое поле .resignFirstResponder, вы также можете добавить туда функцию обновления.

...