2016-08-19 19 views
1

解析するために接続するいくつかのセグメントを持つアプリケーションを作成しています。そのため、解析関数のカスタムクラスを作成しようとしました。UITextViewでnilエラーを取得する

このアドレス帳タブは、最初の試みです。

私はとても単純だと思ったものをぶつけたが、10時間の研究の後、私はここに向っている。ここで

のViewController

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

AppDeleteに追加する必要が
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 
    } 

} 

です:

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


    ParseData.registerSubclass() 

    Parse.enableLocalDatastore() 

上記は訂正された回答であり、正常に動作します。

答えて

1

ParseDataのインスタンスを作成する場所が表示されません。

var parse : ParseData? 

とし、addButtonPressedでそれを宣言していることがわかります。しかし、それを定義するコードはどこにありますか?何かのように:

parse = ParseData() 
+0

ありません。それは私にとって初めてのことです。あなたが提案したもののバリエーションを試しましたが、コールでパラメータ 'firstName'の引数が不足しているというエラーが表示されます。私は早く勉強していますが、未経験であり、あなたの助けに感謝します –

+0

ありがとう、ありがとう。あなたは私を正しい方向に向けるのを助けました。他の誰かがこの問題に遭遇した場合に備えて、私は正しい内容で上記を更新しました。 –

関連する問題