2017-08-27 60 views
0

我对录制APP感到惊讶。导航栏在添加准备功能后消失

我试图在我的第一记录的ViewController添加导航控制器,其然后可以使用下面的函数制备通过文件名阵列到第二的ViewController:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let controller = segue.destination as? MainViewController 
    controller?.recordArray = recordingArray 
    self.present(controller!, animated: true, completion: nil) 
} 

然而,当在导航栏消失模拟器跑出第二控制器和Xcode中弹出警告

线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7fff51edfff8)

有没有人有任何建议? 谢谢!

+0

为什么在展示时强制解包控制器? – Abizern

+0

不,实际上,你为什么用这种方法呈现?所有你应该做的是在segue进行演示之前配置destaonation视图控制器 – Abizern

回答

0

千万别叫present(_:animated:completion:)里面prepare(for segue:)

prepare(for segue)系统会在系统即将发生之前自动由系统自动调用,以便您可以准备数据以发送到目标视图控制器或在执行搜索之前执行任何其他需要的计算。在Storyboard中需要设置一个Segue,它将被自动调用,或者如果它是手动的,则需要使用perform(segue)来调用它,一旦你这样做,系统将为你调用prepare(for segue)。你可以看到为什么调用另一个导航函数证明是有问题的,因为你试图使用两种不同的方法(segue和present)导航到另一个viewcontroller。

如果您尚未在Storyboard中设置Segue,那么您还需要这样做,因为如果未设置,let controller = segue.destination as? MainViewController将为nil

一旦你在故事板设立SEGUE,这是你的函数应该什么样子:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let controller = segue.destination as? MainViewController { 
     controller.recordArray = recordingArray 
     self.present(controller, animated: true, completion: nil) 
    } 
} 
0

你不应该试图以这种方法来呈现一个VC,它只是为你的地方配置目的VC在赛格呈现之前

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    guard let controller = segue.destination as? MainViewController else { return } 
    controller.recordArray = recordingArray 
}