在保存到 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
}
}
}
您应该检查 textFields
的 text
属性 而不是 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 中代码的输出
我在下面有这段代码,当 运行 我希望它检查并查看字段 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
}
}
}
您应该检查 textFields
的 text
属性 而不是 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")
}