我正在尝试使用prepareForSegue函数将数据从PFTableViewCell传递到下一个视图控制器(详细信息)。我想我已经输入了正确的代码,但是当我运行应用程序并单击单元格时,我的应用程序崩溃了,我收到此消息“在解开可选值时意外地发现了nil”。我已尝试使用prepareForSegue函数的许多变体来传递数据但它永远不会出现在下一个视图控制器上。
在我的FirstViewController中,我编写了这段代码:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Detail" {
if let destination = segue.destinationViewController as? ResponseViewController {
let path = tableView?.indexPathForSelectedRow!
let cell = tableView!.cellForRowAtIndexPath(path!) as! Post
destination.name = (cell.name.text!)
destination.message = (cell.message.text!)
}
以下是显示ResponseViewController中传递的数据的代码:
var name = String?()
var message = String?()
@IBOutlet weak var userName: UILabel!
@IBOutlet weak var userMessage: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
userName.text! = name!
userMessage.text! = message!
}
现在我该如何解决这个问题或更好的问题但是如何在swift 2.0中准备ForSegue?
答案 0 :(得分:1)
您的一个可选变量包含 nil 。
使用'!'强制解包可选值。如果在打开包装时,Optional包含nil,则程序会因此错误消息而崩溃。尽量避免使用强制转换(as!
)和强制展开。
这是一个无安全的版本
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Detail" {
if let destination = segue.destinationViewController as? ResponseViewController
, path = tableView?.indexPathForSelectedRow
, cell = tableView?.cellForRowAtIndexPath( path ) as? Post
{
destination.name = cell.name.text ?? "nil"
destination.message = cell.message.text ?? "nil"
}
和
var name: String?
var message: String?
@IBOutlet weak var userName: UILabel?
@IBOutlet weak var userMessage: UILabel?
override func viewDidLoad()
{
super.viewDidLoad()
userName?.text = name ?? "nil"
userMessage?.text = message ?? "nil"
}
N.b:
??
是零合并运算符。如果左侧的值为 nil ,则右侧的值将被替换。 ?.
访问者调用可选值的方法。如果左侧的值为nil
,则结果将短路至nil