swift - 保存核心数据属性时将索引从0移动到1

标签 swift core-data indexing fetch binary-data

下面的 swift 代码将 2 个图像保存到二进制核心数据中。当用户在文本字段中输入 1 或 0 时, ImageView 将获取数据并显示。我想将索引移动到从 1 开始,而不是从 0 开始。当用户在文本字段中输入 0 时, ImageView 中不应显示任何内容。在我的核心数据模型中,pic 是二进制数据。

 import UIKit
import CoreData
class ViewController: UIViewController,UITextFieldDelegate {


@IBOutlet var labelName : UILabel!
@IBOutlet var enterT : UITextField!
@IBOutlet var pic : UIImageView!
lazy var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

override func viewDidLoad() {
    super.viewDidLoad()

    enterT.delegate = self

    pic.backgroundColor = .cyan
    populateData()
}


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

    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
    }
    loadImage(at: index )
    return true
}

func loadImage(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 {
            pic.image = UIImage(data: user.image!)
        } else {
           pic.image = nil
        }
    } catch {
        print("Could not fetch \(error) ")
    }
}

@IBAction func add(){
    // fetch()
}

func populateData()
{
    let item = Users(context: context)
    let vex = UIImage(named: "on.jpg")!.pngData()
    item.image = vex
    item.idx = 0

    let item2 = Users(context: context)
    let vex2 = UIImage(named: "house.jpg")!.pngData()
    item2.image = vex2
    item2.idx = 1

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

最佳答案

你可以做的是调用index - 1

当用户在文本字段中输入 0 时,imageview 中不会显示任何内容,因为索引 - 1 变为 -1 并且 NSPredicate(format: "idx == %d", Int32 (索引))返回零

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

    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
    }
    loadImage(at: index - 1 )
    return true
}

希望它能帮助你=)快乐编码

或者您可以做的是在删除应用程序后相应地将索引保存在coredata

func populateData()
{
    let item = Users(context: context)
    let vex = UIImage(named: "on.jpg")!.pngData()
    item.image = vex
    item.idx = 1

    let item2 = Users(context: context)
    let vex2 = UIImage(named: "house.jpg")!.pngData()
    item2.image = vex2
    item2.idx = 2

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

关于swift - 保存核心数据属性时将索引从0移动到1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60044489/

相关文章:

swift - 如何使用Swift在WebView中查找和突出显示文本

multithreading - 调用 NSManagedObject 函数会中断,但访问变量时不会中断

pdf - 如何使用 poppler 提取 pdf 索引/目录?

javascript - 如何在 JavaScript 中创建一个索引从 1 开始的数组?

ios - 使用 segue 在 View Controller 之间传递变量

ios - Swift UITableViewCell subview 布局更新延迟

iOS8 在 [GAIDataStore 保存] 中卡住

mysql - 解释查询 - MySQL 不使用表中的索引

swift - UIBezierPath 不适用于右上角和右下角

iphone - NSPredicate 获取 NSSet CoreData 中的特定数据?