在保存到 CoreData 之前检查数据是否为 ​​nil

Check for nil in data before saving to CoreData

我在下面有这段代码,当 运行 我希望它检查并查看字段 itemName、itemNote 等是否为空,如果是,则显示 UIAlertController 并阻止用户继续。我尝试使用的代码位于 saveTapped IBAction 函数下。目前,在 运行 时间它似乎绕过所有检查并直接进入 "if(item != nil) {" 检查。

如有任何见解,我们将不胜感激。

import UIKit
import CoreData

class AddEditViewController: UIViewController, NSFetchedResultsControllerDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

var item : Item? = nil

@IBOutlet weak var itemName: UITextField!
@IBOutlet weak var itemNote: UITextField!
@IBOutlet weak var hoursPlayed: UITextField!
@IBOutlet weak var imageHolder: UIImageView!

let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

override func viewDidLoad() {
    super.viewDidLoad()

    if item != nil {
        itemName.text = item?.name
        itemNote.text = item?.note
        hoursPlayed.text = item?.hoursPlayed
        imageHolder.image = UIImage(data: (item?.image)!)
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func AddImage(sender: AnyObject) {
    let pickerController = UIImagePickerController()
    pickerController.delegate = self
    pickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    pickerController.allowsEditing = true

    self.presentViewController(pickerController, animated: true, completion: nil)
}

@IBAction func addImageFromCamera(sender: AnyObject) {
    let pickerController = UIImagePickerController()
    pickerController.delegate = self
    pickerController.sourceType = UIImagePickerControllerSourceType.Camera
    pickerController.allowsEditing = true

    self.presentViewController(pickerController, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
    self.dismissViewControllerAnimated(true, completion: nil)

    self.imageHolder.image = image
}

@IBAction func saveTapped(sender: AnyObject) {

    var nameMissing = ""

    if itemName == nil {
        nameMissing = "name"
        print("item missing")
    }
    else if itemNote == nil {
        nameMissing = "note"
        print("note missing")
    }
    else if hoursPlayed == nil {
        nameMissing = "hours played"
        print("hours played missing")
    }
    else if imageHolder == nil {
        nameMissing = "image"
        print("image missing")
    }

    if (itemName == nil || itemNote == nil || hoursPlayed == nil || imageHolder == nil) {
        let missingDetailsAlertController = UIAlertController(title: "Alert", message: "Complete field for \(nameMissing).", preferredStyle: UIAlertControllerStyle.Alert)
        missingDetailsAlertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default, handler: nil))
        self.presentViewController(missingDetailsAlertController, animated: true, completion: nil)
        return
    }

    if(item != nil) {
        editItem()
    } else {
        createNewItem()
    }
    dismissViewController()
}

@IBAction func cancelTapped(sender: AnyObject) {
    dismissViewController()
}

func dismissViewController() {
    navigationController?.popViewControllerAnimated(true)
}

func createNewItem() {
    let entityDescription = NSEntityDescription.entityForName("item", inManagedObjectContext: moc)

    let item = Item(entity: entityDescription!, insertIntoManagedObjectContext: moc)

    item.name = itemName.text
    item.note = itemNote.text
    item.hoursPlayed = hoursPlayed.text
    item.image = UIImagePNGRepresentation(imageHolder.image!)

    do {
        try moc.save()
    } catch {
        print("Create Save Failed.")
        return
    }
}

func editItem() {
    item?.name = itemName.text
    item?.note = itemNote.text
    item?.hoursPlayed = hoursPlayed.text
    item!.image = UIImagePNGRepresentation(imageHolder.image!)

    do {
        try moc.save()
    } catch {
        print("Edit Save Failed.")
        return
    }
}
}

您应该检查 textFieldstext 属性 而不是 nil。 试试这个:

if let name = itemName.text where name.characters.count > 0 {
   //show your alert
} else if let note = itemNote.text where note.characters.count > 0 {
  //show your alert
} else if let hours = hoursPlayed.text where hours.characters.count > 0 {
  //show your alert
} else if let image = imageHolder.image {
   //show your alert
}

如果您想在没有警报的情况下访问该值,那么您也可以针对 UITextFields:

尝试此操作
let name = itemName.text ?? ""
let note = itemNote.text ?? ""
let hours = hoursPlayed.text ?? ""

无需每次都做额外的代码

使用这个简单的代码检查空字符串

let bananaName = "       "  //Empty String

let mango = "Mango"


//Make file for this function and call like my example below return Boolean value for check the value

//Function
struct Checker {

    static func isEmptyfor(content:String) -> Bool? {

        guard content.trimString.isEmpty else {
            print("Not Empty")
            return true
        }

        print("Empty")
        return false
    }

}

// String Extenion here for Validate trim String
extension String {
    var trimString:String {
       return  self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    }
}

//***Final Code here for use this Only for check your string

//Call Function here Like This
//##exp 1
if Checker.isEmptyfor(bananaName)! {
    print("Not Empty")
   //Do something here

}else{
    print("Empty")
}

//##exp 2
if Checker.isEmptyfor(mango)! {
    print("Not Empty")
  //Do something here

}else{
    print("Empty")
}

Playground 中代码的输出