簡體   English   中英

PFObject沒有被轉換為子類

[英]PFObject not being casted into Subclass

*子類在我的應用程序委托中注冊

用戶可以創建classroom對象。 問題是當創建一個新的classroom對象時,以下查詢將把最新的classroom作為PFObject 這將使程序崩潰。

先前制作的classrooms將被正確閱讀。

另外-當我關閉應用程序並重新啟動它時,最新的教室將被正確地讀取為classroom 如何將新創建的教室轉換為正確的子類?

收到的錯誤是:

    fatal error: NSArray element failed to match the Swift Array Element type

謝謝!

classroom對象的類代碼:

    class Classroom: PFObject, PFSubclassing{

var professorLastName: String?
var classTitle: String?
var toSchool: School?
var subjectLevel: String?
var subject: String?
var enrolledUsers: [PFUser]?

//THIS IS FOR CREATING A NEW CLASS
func enrollClass(){
    let classroom = PFObject(className: "Classroom")

    classroom["subject"] = self.subject
    ...


    classroom.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
        print("added student to class.")
    }
} 

    //start protocol code for PFSubclass
static func parseClassName() -> String {
    return "Classroom"
}

override class func initialize() {
    var onceToken : dispatch_once_t = 0;
    dispatch_once(&onceToken) {
        self.registerSubclass()
    }
}
//end

這是QUERY,可從Parse數據庫中提取教室並將其放入表格視圖行單元格中:

查詢:

    let query = PFQuery(className: "_User")
    query.includeKey("enrolledClasses")
    query.getObjectInBackgroundWithId(PFUser.currentUser()!.objectId!) {(result:PFObject?, error: NSError?) -> Void in
        let userEnrolledClasses = result!["enrolledClasses"] as! [Classroom]
        completionBlock(userEnrolledClasses) 

插入行單元格:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("enrolledClassCell") as! EnrolledClassesTableViewCell

    //THE CODE CRASHES HERE!!!! 
    let classroom = timelineComponent.content[indexPath.row] as? Classroom
    //NSARRAY FAILED TO MATCH ARRAY TYPE -> It's still PFObject



    classroom?.setClass()
    cell.enrolledOption.text = classroom?.classTitle
    return cell
}

讀出: 在此處輸入圖片說明

AppDelegate中:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Classroom.registerSubclass()
    School.registerSubclass()
    Post.registerSubclass()
    PostPoints.registerSubclass()
    ReplyPost.registerSubclass()
    ReplyPostPoints.registerSubclass()
    SubjectList.registerSubclass()

    Parse.enableLocalDatastore()

**根據Daniel的修復程序的新代碼...

因此,這些對象被當作classroom讀取,但是現在嘗試從教室對象中拉出數據的嘗試無效。 所以我想將標簽設置為classroom.classTitle作為表行,但是數據始終為零...

    //TIMELINE IMPLEMENTATION
func loadInRange(range: Range<Int>, completionBlock: ([Classroom]?) -> Void) {
    Classroom.registerSubclass()

    let query = PFQuery(className: "_User")
    query.includeKey("enrolledClasses")
    query.getObjectInBackgroundWithId(PFUser.currentUser()!.objectId!) {(result:PFObject?, error: NSError?) -> Void in

        let rawPFObject = result!["enrolledClasses"] as! [PFObject]
        var classroomArray: [Classroom] = []

        for rawClassroom in rawPFObject{
            let convertedClassroom = Classroom()
            convertedClassroom.classTitle = rawClassroom["classTitle"] as? String
            convertedClassroom.subject = rawClassroom["subject"] as? String
            convertedClassroom.professorLastName = rawClassroom["professorLastName"] as? String
            convertedClassroom.subjectLevel = rawClassroom["classTitle"] as? String
            classroomArray.append(convertedClassroom)
        }

        completionBlock(classroomArray)

    }
}

標簽分配:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("enrolledClassCell") as! EnrolledClassesTableViewCell
    //the tableViewCell post is equal to the post[arrayNumber]
    let classroom = timelineComponent.content[indexPath.row] as? Classroom
    //CLASSROOM VALUES ARE ALL NIL HERE
    classroom?.setClass()
    cell.enrolledOption.text = classroom?.classTitle
    return cell
}

控制台讀數:

在此處輸入圖片說明

也許與objectId為“新”有關?

讀出timelineComponent.content

在此處輸入圖片說明

您遇到的問題是在查詢中無法強制轉換為Classroom數組。 這可能是Parse對象子類的缺點。

一種解決方法是創建一個臨時數組,該數組將傳遞給completionBlock。

在此臨時數組中,將添加明確創建為Parse子類的Classroom對象。

在您的“課堂”課程中,添加:

func loadFromObject(object: PFObject) {
    // Setup a Classroom object from a PFObject.

    self.subject = object["subject"]

   ...
}

在查詢中,替換這些行

let userEnrolledClasses = result!["enrolledClasses"] as! [Classroom]
completionBlock(userEnrolledClasses) 

var classroomArray = Array<Classroom>()

for class in result!["enrolledClasses"] {
    let newClass = Classroom().loadFromObject(class)
    classroomArray.append(newClass)
}

completionBlock(classroomArray) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM