[英]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.