我的解析有问题。我在Event和Type之间的数据库中有关系。所以,事件有它的类型,包括标题和颜色(和其他属性,但关注关系) 事件:
@NSManaged var type: Type
另外,我有计算机属性eventColor:
var eventColor: UIColor{
return type?.typeColor ?? UIColor.clearColor()
}
基本查询:
override class func query() -> PFQuery? {
//1
let query = PFQuery(className: Event.parseClassName())
//2
query.includeKey("type")
//3
query.orderByDescending("startDate")
return query
}
控制器:
var events = [Event](){
didSet { eventsTableView.reloadData() }
}
我正在提出要求:
query?.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
self.activityIndicator.stopAnimating()
if let objects = objects as? [Event] where error == nil{
println("Count is: \(objects.count)")
for event in objects{
event.pinInBackground()
println("\(event.type)") //Here, type is available... and it prints out
}
self.events = objects // Property observer is called
}
else{
println("Handle error...")
}
})
在表视图重新加载后调用的代码:
tableView cellForRow....(){
let event = self.events[indexPath.row]
let color = event.eventColor // BAD ACCESS, because "type" dissappears.
}
因此,在发出此请求并在视图控制器中将数组事件分配给数组之后,我正在尝试读取计算机属性事件颜色并且它失败(EXC_BAD_ACCESS)。似乎类型对象在块中可用,它在获取事件后执行,但后来它消失了,每次我想读它时,我都有应用程序运行时错误。 我不知道,感觉对象在块中保持像弱(因为我包括“includeKey”和类型被下载),但后来它只是立即解除分配。我应该怎么做,以防止解除分配类型?我可以创建自己的Type对象,而不是PFObject的子类,但我相信在某个地方应该有另一种更清洁的方式。
谢谢
编辑: 好的,所以我发现了更多的调查(cellForRow ......) 我试图通过下标PFObject获取类型和它的颜色属性:
let typeItem = eventItem["type"] as! PFObject
println("type is: \(typeItem)")
/*
type is: <Type: 0x7fe99bdf3330, objectId: dkEXw2r7zh, localId: (null)> {
color = "#F29C31";
name = swift;
}
*/
let colorFromType = typeItem["color"]
println("color: \(colorFromType)") //Works, returns valid value.
但是以其他方式写作:
let type = eventItem.type
let color = type?.color //Compiles, but runtime error:
'NSInvalidArgumentException', reason: '-[PFObject color]: unrecognized selector sent to instance 0x7fe99bdf3330'
println("type: \(type), color: \(color)")
所以我不完全确定,为什么会这样。看起来Event的这个类型属性无法转换为Type,但我确定这是属性类型。
编辑,决议: 好吧,我是如此愚蠢,我不知道注册子类,Type.registerSubclass解决了所有问题。
答案 0 :(得分:0)
听起来你需要在tableView cellForRow....()
调用中对该对象进行类型转换。
如果没有演员,您对.eventColor
的来电将失败,而且就我所见,演员表未保存到self.events
。试试这个:
tableView cellForRow....(){
let event = self.events[indexPath.row] as! Event
let color = event.eventColor
}
此外,如果您使用的是子类,则需要确保提前使用registerSubclass
,否则您的属性将无法使用!