swift - 使用 UITextView 出现 nil 错误

标签 swift uitextview

我正在创建一个应用程序,其中有几个部分将连接到解析,所以我想我会尝试为解析函数创建一个自定义类。

这个地址簿标签是第一次尝试。

我遇到了一些我认为很简单的事情,但经过 10 个小时的研究,我转向这里。

这是 View Controller

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()
    }

如前所述,错误是第一行“try”

奇怪的是发送到 Person 类的数据工作正常。 此外,当我在这个 VC 上使用 Parse 函数时,它可以工作(尽管代码经过修改)

这是 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()

以上是更正后的答案,效果很好。

最佳答案

我看不到,您在哪里创建 ParseData 的实例。我明白了,你用

声明它
var parse : ParseData?

然后在 addButtonPressed 中使用它。但在这两者之间,定义它的代码在哪里?像这样的东西:

parse = ParseData()

关于swift - 使用 UITextView 出现 nil 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39047588/

相关文章:

ios - 使用嵌套的 UIStackview 隐藏 UIStackView

swift - 如何重新连接 IB socket

swift - macOS NSTabViewController 居中选项卡图标

ios - 如何使用搜索栏过滤字典数组

iphone - 在为 iPhone UITextView 输入时建议 # 标签(如 Twitter)

objective-c - 如何禁用 UITextView 上的键盘?

ios - 你如何在 Swift 中为 iOS 制作垂直文本 UILabel 和 UITextView?

ios - animateWithDuration(有时)跳到最终位置而不使用动画

iphone - 如何向 UITextField 和 UITextView 添加方法?

iphone - 限制 UITextView 或 UITextField 中粘贴的字符串长度