我正在尝试从View Controller中的Parse中提取用户的图像。但是,每当我运行应用程序时,它都会因此错误崩溃:
libswiftCore.dylib`swift_dynamicCastObjCClassUnconditional:
0x106742620: pushq %rbp
0x106742621: movq %rsp, %rbp
0x106742624: pushq %rbx
0x106742625: pushq %rax
0x106742626: movq %rsi, %rcx
0x106742629: movq %rdi, %rbx
0x10674262c: xorl %eax, %eax
0x10674262e: testq %rbx, %rbx
0x106742631: je 0x10674264c ; swift_dynamicCastObjCClassUnconditional + 44
0x106742633: movq 0x82756(%rip), %rsi ; "isKindOfClass:"
0x10674263a: movq %rbx, %rdi
0x10674263d: movq %rcx, %rdx
0x106742640: callq 0x1067451ca ; symbol stub for: objc_msgSend
0x106742645: testb %al, %al
0x106742647: movq %rbx, %rax
0x10674264a: je 0x106742653 ; swift_dynamicCastObjCClassUnconditional + 51
0x10674264c: addq $0x8, %rsp
0x106742650: popq %rbx
0x106742651: popq %rbp
0x106742652: retq
0x106742653: leaq 0xcdc8(%rip), %rax ; "Swift dynamic cast failed"
0x10674265a: movq %rax, 0x8ae57(%rip) ; gCRAnnotations + 8
0x106742661: int3
0x106742662: nopw %cs:(%rax,%rax)
我知道图像存在且用户属性在Parse中被正确地称为“图像”。用户对象来自前一屏幕的segue。当我注释掉图像代码时,用户名字标签显示正确,因此我知道用户对象有效。
如果我设置应用程序似乎崩溃let userImageFile = user?["image"] as PFFile
的断点,我可以用鼠标指针悬停在userImageFile上,并显示“ObjectiveC.NSObject(NSObject)”。一旦我继续通过断点,应用程序就会因上面的错误而崩溃。
以下是相关代码:
import UIKit
class GameViewController: UIViewController {
@IBOutlet weak var userName: UILabel!
@IBOutlet weak var timer: UILabel!
@IBOutlet weak var userImage: UIImageView!
var user: PFUser?
override func viewDidLoad() {
super.viewDidLoad()
userName.text = user?["first_name"] as String?
let userImageFile = user?["image"] as PFFile
userImageFile.getDataInBackgroundWithBlock{
(imageData: NSData!, error: NSError!) -> Void in
if error == nil{
let image = UIImage(data: imageData)
self.userImage.image = image
} else {
println(error)
}
}
}
}
有什么想法吗?我认为它必须与userImageFile是ObjectiveC NSObject有关,但我不知道该怎么做。非常感谢任何帮助。
谢谢!
答案 0 :(得分:1)
尝试执行以下操作:
override func viewDidLoad() {
super.viewDidLoad()
if let user = user{
userName.text = user["first_name"] as? String
if let userImageFile = user["image"] as? PFFile{
userImageFile.getDataInBackgroundWithBlock { imageData, error in
if error == nil{
let image = UIImage(data: imageData)
self.userImage.image = image
} else {
println(error)
}
}
}
}
}
同样优良的做法是以明确基础类型的方式命名IBOutlet
。例如:
userName - > userNameLabel
计时器 - > timerLabel等。
希望这会有所帮助!
答案 1 :(得分:0)
失败的演员似乎表明你没有存储PFFile ......或根本没有存储任何东西...... 您能否在用户中显示存储文件的代码?
您还可以在Parse控制台中查看用户的内容。 添加一个名为" image"的额外列类型为File(PFFile的名字)。 当您点击断点时,刷新控制台并检查'图像的内容。列。