*子类在我的app delegate
中注册用户可以创建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
这是从Parse数据库中提取教室并将其放入表视图行单元格的QUERY:
QUERY:
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()
**根据丹尼尔的修正新代码...
因此,对象被视为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是“new”有关吗?
timelineComponent.content
答案 0 :(得分:1)
您遇到的问题是,在您的查询中,转换为Classroom
数组无法正常工作。这可能是Parse对象子类的缺点。
解决方法是创建一个将传递给completionBlock的临时数组。
在这个临时数组中将添加Classroom
个显式创建为Parse子类的对象。
在您的课堂课程中,添加:
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)