繁体   English   中英

Swift 4在错误警报后再次按下按钮时,它不起作用

[英]Swift 4 When button is pressed a second time following an error alert it doesn't work

我敢肯定,我的问题的答案非常简单,但似乎无法在线找到答案。 我可能措辞不好。

我正在创建一个用于数据收集且不会公开的应用程序,因此我正在使用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)
    }
}

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

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

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

建议:-您需要将NSPredicateNSFetchRequest一起使用,而不是获取所有用户。

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM