在 ViewController :
中override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "Segue") {
var svc = segue.destinationViewController as! ViewController2;
svc.vericik = self.vericik
}
}
@IBAction func gotoView2(sender: AnyObject) {
self.performSegueWithIdentifier("Segue", sender: self)
self.presentViewController(ViewController2(), animated: true, completion: nil)
}
在 ViewController2 :
中var vericik: String!
@IBOutlet weak var VeriYeri: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
VeriYeri.text = vericik
}
当我点击ViewController上的按钮时,ViewController2页面进入屏幕,我可以看到来自ViewController的segue数据。但在此之后,会出现错误:
致命错误:在解包可选值时意外发现nil
我在哪里做错了?
答案 0 :(得分:1)
你的问题就在这一行:
self.presentViewController(ViewController2(), animated: true, completion: nil)
这行代码正在创建第二 ViewController2
。当您self.performSegueWithIdentifier("Segue", sender: self)
时,第一个是为您创建的。第二个ViewController2
永远不会被初始化,因此当vericik
运行时它的nil
属性仍为viewDidLoad
,并隐式地将VeriYeri.text = vericik
展开为可选项(因为vericik
}被声明为String!
)。
要解决此问题,只需删除以下代码行:
self.presentViewController(ViewController2(), animated: true, completion: nil)
不需要。 segue为您创建ViewController2
,并在prepareForSegue
中初始化它,然后segue显示ViewController2
。使用segues时,您无需拨打presentViewController
。
答案 1 :(得分:0)
不知何故,您将vericik
变量设置为nil
。您可以在尝试在segue之前设置之前打印该值吗?如果是nil
,请不要将其设置为文本,因为这会导致崩溃。
答案 2 :(得分:0)
您需要检查您的字符串是否为零。试试这个。
ViewController2
override func viewDidLoad() {
super.viewDidLoad()
if vericik != nil {
//String is not nil, set textfield/label whatever
VeriYeri.text = vericik
}
}
的ViewController
if (segue.identifier == "Segue") {
var svc = segue.destinationViewController as! ViewController2;
if self.vericik != nil {
//String is not nil. All is good :)
svc.vericik = self.vericik
} else {
//String is nil, do something...maybe set default text
svc.vericik = "some text"
}
}