【问题标题】:use textFieldDidEndEditing textfield delegate to find 3 element in array使用 textFieldDidEndEditing 文本字段委托在数组中查找 3 个元素
【发布时间】:2020-01-13 16:02:59
【问题描述】:

我下面的 swift 代码在 textfield var enterT 中使用 UITextFieldDelegate。 nameString 将核心数据实体转换为字符串数组,例如 [bob,bryan,jessica]。在 textFieldDidEndEditing 中,我希望用户能够输入任何数字,例如要打印的数组中的 3 和第三个元素,然后对数组进行排序。

import UIKit
import CoreData

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

let appDelegate = UIApplication.shared.delegate as! AppDelegate //Singlton instance
var context:NSManagedObjectContext!

override func viewDidLoad() {
    super.viewDidLoad()

    openDatabse()




}

func textFieldDidEndEditing(_ textField: UITextField) {
    guard let index = Int(textField.text!) else {
        // display an alert about invalid text
        return
    }
    joke(at: index)
}

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 {
            print(user.username)
        }
    } catch {
        print("Could not fetch \(error) ")
    }
}


func openDatabse()
{
    context = appDelegate.persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: "Users", in: context)
    let newUser = NSManagedObject(entity: entity!, insertInto: context)
    let newUser2 = NSManagedObject(entity: entity!, insertInto: context)
    let newUser3 = NSManagedObject(entity: entity!, insertInto: context)
    saveData(UserDBObj: newUser, UserDBObj2: newUser2, UserDBObj3: newUser3)

}

func saveData(UserDBObj:NSManagedObject,UserDBObj2:NSManagedObject,UserDBObj3:NSManagedObject)
{
    UserDBObj.setValue("kim kardashian", forKey: "username")
    UserDBObj2.setValue("jessica biel", forKey: "username")
    UserDBObj3.setValue("Hailey Rienhart", forKey: "username")




    print("Storing Data..")
    do {
        try context.save()
    } catch {
        print("Storing data Failed")
    }

    fetchData()
}

func fetchData()
{
    print("Fetching Data..")
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
    request.returnsObjectsAsFaults = false
    do {
        let result = try context.fetch(request)
        for data in result as! [NSManagedObject] {
            let userName = data.value(forKey: "username") as! String

            print("User Name is : "+userName)
        }
    } catch {
        print("Fetching data Failed")
    }
}}

【问题讨论】:

  • 你读过我的cmets吗? Core Data 保存记录无序result 的顺序是随机的。要将记录与固定索引相关联,您必须将 index 属性添加到 Core Data 模型。然后就可以通过index获取对应的记录了。
  • @vadian 我不知道该怎么做?您是在谈论点击核心数据模型。单击属性,然后单击聚光灯下的索引。
  • 不,我的意思是在username 旁边添加一个属性index(随意命名)为Int32
  • @vadian 在上面添加了一张照片。我现在应该做什么。

标签: arrays swift sequence uitextfielddelegate


【解决方案1】:

将输入的数字转换为Int。如果成功,则将整数传递给joke 并获取与idx 属性匹配的记录。

考虑索引从零开始。如果要输入以 1 开头的数字,则必须减少索引 (joke(at: index - 1))

@IBOutlet var enterT : UITextField!

func textFieldDidEndEditing(_ textField: UITextField) {
    guard let index = Int(textField.text!) else { 
      // display an alert about invalid text
      return 
    }
    joke(at: index)
}

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 {
            print(user.username)
        }
    } catch {
        print("Could not fetch \(error) ")
    }
}

注意:我建议在核心数据模型中将idxusername 定义为非可选。并确保所有 idx 值都是唯一的。

【讨论】:

  • 我在上面添加了我所有的代码编译但是当用户在文本字段 enterT 中输入数字时它没有效果。
  • 我添加了我正在寻找的 GIF。感谢您迄今为止的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2018-07-15
相关资源
最近更新 更多