2016-08-19 34 views
1

我正在創建一個應用程序,該應用程序會連接到解析的多個段,所以我想我會嘗試爲解析函數創建一個自定義類。使用UITextView獲取無錯誤

此地址簿標籤是第一次嘗試。

我碰到了一件我認爲會很簡單的事情,但經過10個小時的研究後,我轉向了這裏。

這裏是視圖控制器

var addressUUID = NSUUID().UUIDString 


class AddViewController : UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 


@IBOutlet weak var addressImage : UIImageView! 
@IBOutlet weak var nameField : UITextField! 
@IBOutlet weak var lastNameField : UITextField! 
@IBOutlet weak var phoneField : UITextField! 
@IBOutlet weak var emailField : UITextField! 
@IBOutlet weak var addressCityField : UITextField! 
@IBOutlet weak var addressCountryField : UITextField! 

@IBOutlet weak var nameFieldLabel : UILabel! 
@IBOutlet weak var lastNameFieldLabel : UILabel! 
@IBOutlet weak var phoneFieldLabel : UILabel! 
@IBOutlet weak var emailFieldLabel : UILabel! 
@IBOutlet weak var addressCityFieldLabel : UILabel! 
@IBOutlet weak var addressCountryFieldLabel : UILabel! 
@IBOutlet weak var doneButton: UIButton! 

@IBOutlet weak var scrollView: UIScrollView! 
var scrollViewHeight : CGFloat = 0 

var person : Person? 
var parse : ParseData? 
// creating frame for keyboard to force scroll view up 
var keyboard = CGRect() 

@IBAction func addButtonPressed(sender : UIButton) { 
    //NSLog("Button pressed") 


    print ("\(nameField.text)") 


    parse = ParseData.init(firstName: nameField.text!) 

    // Saves data to Parse class, regardless of if new or updated record 
    do { 

     try parse!.setFirstName(nameField.text!) 
     try parse!.setLastName(lastNameField.text!) 
     try parse!.setPhone(phoneField.text!) 
     try parse!.setEmail(emailField.text!) 
     try parse!.setAddressCity(addressCityField.text!) 
     try parse!.setAddressCountry(addressCountryField.text!) 
     try parse!.setAddressImage(addressImage.image!) 
     try parse!.setUUID(addressUUID) 

    } catch let error as PersonValidationError { 
     var errorMsg = "" 

     switch(error) { 
     case .InvalidFirstName: 
      errorMsg = "Invalid first name" 
     case .InvalidAddressCity: 
      errorMsg = "Invalid City" 
     case .InvalidEmail: 
      errorMsg = "Invalid email address" 
     case .InvalidPhone: 
      errorMsg = "Invalid phone number" 
     case .InvalidAddressImage: 
      errorMsg = "Invalid Image" 
     case .InvalidAddressCountry: 
      errorMsg = "Invalid Country" 
     } 
     let alert = UIAlertController(title: "Error", message: errorMsg, preferredStyle: .Alert) 

     alert.addAction(UIAlertAction(title: "Okay", style: .Default, handler: nil)) 

     self.presentViewController(alert, animated: true, completion: nil) 
    } catch { 

    } 

    if person == nil 
    { 
     parse!.saveAddressToParse() 
    } else { 
     parse!.updateAddressToParse() 
    } 

如前所述,錯誤是「嘗試」

奇怪的是發送到Person類工作正常,數據的第一行。 此外,當我對這個VC的解析功能,它的工作(儘管經過修改的碼)

這裏是類ParseData

import Foundation 
import Parse 


enum ParseValidationError : ErrorType { 
    case InvalidFirstName 
    case InvalidAddressCity 
    case InvalidPhone 
    case InvalidEmail 
    case InvalidAddressCountry 
    case InvalidAddressImage 
} 

// class ParseData : PFObject, PFSubclassing 

class ParseData : PFObject, PFSubclassing 
{ 
    private(set) var firstName : String? 
    private(set) var lastName : String? 
    private(set) var addressCity : String? 
    private(set) var addressCountry : String? 
    private(set) var phone : String? 
    private(set) var email : String? 
    private(set) var uuid : String? 
    private(set) var addressImageFile : UIImage? 

    var person : Person? 

    init?(firstName fn: String) { 
     super.init() 
     do { 
      try setFirstName(fn) 
     } catch { 
      return nil 
     } 

    } 
    static func parseClassName() -> String { 
     return "ParseData" 
    } 

    func saveAddressToParse() { 

     print ("saveToParse function begins") 

     let savedAddressObject = PFObject(className: "addressBook") 

     savedAddressObject["firstName"]   = self.firstName! 
     savedAddressObject["lastName"]   = self.lastName! 
     savedAddressObject["phone"]    = self.phone! 
     savedAddressObject["email"]    = self.email! 
     savedAddressObject["addressCity"]  = self.addressCity! 
     savedAddressObject["addressCountry"]  = self.addressCountry! 
     savedAddressObject["username"]   = PFUser.currentUser()!.username 
     savedAddressObject["uuid"]    = addressUUID 
     savedAddressObject["entryFrom"]   = "Divelog New" 

     let addressBookImageData = UIImageJPEGRepresentation(self.addressImageFile!, 0.5) 
     let addressBookImageFile = PFFile(name: "addressBookImage.jpg", data: addressBookImageData!) 
     savedAddressObject ["addressBookImage"] = addressBookImageFile 

     savedAddressObject.pinInBackground() 
     savedAddressObject.saveEventually() 
    } 


    func updateAddressToParse() { 

     print ("updateToParse function begins") 

     let updateAddressQuery = PFQuery(className: "addressBook") 
     updateAddressQuery.whereKey("uuid", equalTo: person!.uuid!) 
     updateAddressQuery.getFirstObjectInBackgroundWithBlock {(objects: PFObject?, error: NSError?) -> Void in 

      if error == nil { 

       if let updateAddressObject = objects { 

        updateAddressObject.setValue(self.firstName!, forKey: "firstName") 
        updateAddressObject.setValue(self.lastName!, forKey: "lastName") 
        updateAddressObject.setValue(self.phone!, forKey: "phone") 
        updateAddressObject.setValue(self.email!, forKey: "email") 
        updateAddressObject.setValue(self.addressCity!, forKey: "addressCity") 
        updateAddressObject.setValue(self.addressCountry!, forKey: "addressCountry") 
        updateAddressObject.setValue("Divelog Update", forKey: "entryFrom") 

        let addressBookImageData = UIImageJPEGRepresentation(self.addressImageFile!, 0.5) 
        let addressBookImageFile = PFFile(name: "addressImage.jpg", data: addressBookImageData!) 
        updateAddressObject.setValue(addressBookImageFile!, forKey: "addressBookImage") 

        updateAddressObject.pinInBackground() 
        updateAddressObject.saveEventually() 
       } 
      } 
     } 
    } 

    func setFirstName(fn : String) throws { 
     firstName = fn 
    } 

    func setLastName(ln : String) throws { 
     lastName = ln 
    } 

    func setPhone (ph : String) throws { 
     phone = ph 
    } 

    func setEmail (em : String) throws { 
     email = em 
    } 

    func setAddressCity(adc : String) throws { 
     addressCity = adc 
    } 

    func setAddressCountry(ad : String) throws { 
     addressCountry = ad 
    } 

    func setAddressImage(ai : UIImage) throws { 
     addressImageFile = ai 
    } 

    func setUUID(ui : String) throws { 
     uuid = ui 
    } 

} 

需要添加到APPDELETE:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 


    ParseData.registerSubclass() 

    Parse.enableLocalDatastore() 

以上是更正的答案,它工作正常。

回答

1

我不能看到,你創建一個ParseData的實例。我看到,你聲明它與

var parse : ParseData? 

然後在addButtonPressed你使用它。但在中間,定義它的代碼在哪裏?例如:

parse = ParseData() 
+0

沒有。這對我來說是新的。我嘗試了你所建議的變體,但得到錯誤,我在調用中缺少參數'firstName'的參數。我的學習速度很快,但仍然缺乏經驗,我將不勝感激 –

+0

謝謝,明白了。你幫助我指出了正確的方向。以防萬一有人遇到這個問題,我已經用正確的細節更新了上面的內容。 –

相關問題