首页 > 解决方案 > Swift 4 在出现错误警报后第二次按下按钮时它不起作用

问题描述

我确定我的问题的答案很简单,但我似乎无法在网上找到答案。我可能措辞不好。

我正在创建一个用于数据收集且不会公开的应用程序,因此我使用 Core Data 来管理用户。使用每台设备的用户不会超过几个。

当用户尝试使用已存在的电子邮件创建新电子邮件时,会出现我想要的警报。但是,当他们退出警报并尝试再次输入电子邮件时,该按钮不起作用。

这是我的代码:

  @IBAction func startSessionButtonPressed(_ sender: Any) {

    // check email isn't already in use
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
    request.returnsObjectsAsFaults = false

    do {
        let results = try context.fetch(request)

        if results.count > 0 {
            for result in results as! [NSManagedObject] {
                let email = result.value(forKey: "email") as? String
                if email == inputField.text {
                    newUser = false
                    let alert = UIAlertController(title: "Error", message: "Email already in use!", preferredStyle: .alert)
                    alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
                    present(alert, animated: true, completion: nil)
                }
            }
        }
    } catch {
        print(error)
    }

    if newUser {
        let newUser = NSEntityDescription.insertNewObject(forEntityName: "Users", into: context)
        newUser.setValue(inputField.text, forKey: "email")
        newUser.setValue(1, forKey: "session")
        newUser.setValue(0, forKey: "phraseNumber")
        newUser.setValue(UIDevice.current.modelName, forKey: "device")

        emails.append(inputField.text!)
        sessions.append(1)
        phraseNumbers.append(0)

        myIndex = emails.index(of: inputField.text!)!

        do {
            try context.save()
            print("saved")
        } catch {
            print(error)
        }

        performSegue(withIdentifier: "segue", sender: self)
    }
}

如何“重置”按钮,以便当用户第二次或第三次尝试时它会响应?

标签: iosswiftcore-dataswift4

解决方案


如果您编写已存在的电子邮件,请在您的按钮中单击,然后newUser设置为false,因此您需要在发出获取请求之前重置newUser为。true

@IBAction func startSessionButtonPressed(_ sender: Any) {
    //Set newUser to true
    newUser = true
    // Now check email isn't already in use
    ...
}

建议:-您需要使用NSPredicate您的NSFetchRequest而不是获取所有用户。

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
request.predicate = NSPredicate(format: "email == %@", inputField.text ?? "")
//Now just check that array is empty or not.
do {
   let results = try context.fetch(request)
   newUser = results.isEmpty
}
//Note:- If you check like this then there is no need to reset newUser variable 

推荐阅读