Swift segue致命错误

时间:2015-06-29 22:03:55

标签: ios iphone swift segue

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

我在哪里做错了?

3 个答案:

答案 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"
          }
}