Swift-Keep get"致命错误:在打开一个Optional值时意外发现nil"

时间:2015-07-08 06:28:35

标签: ios swift cocoa-touch ios8

我只使用了Swift和Xcode 6几周,但我已经在研究一个应用程序的想法了。我尝试使用的应用程序部分将如下所示: 1)用户有一个按钮网格,每个按钮在点击时都会做一些不同的事情 2)用户可以点击视图右下方的齿轮按钮,然后将以模态方式显示新视图,即临时设置窗格(标签和开关)。如果通过按钮名称的标签切换,则隐藏该按钮。 3)用户点击“保存”按钮(当前与NSUserDefaults无关,或者在应用程序关闭后实际保存功能,它当前只是一个后退按钮)以及任何关闭的开关他们各自的按钮出口隐藏。

但是,实际项目运行如下: 1)完美的工作 2)当我点击齿轮时,按计划显示设置窗格。我也可以在周围滑动开关,但是当我点击保存按钮时,应用程序崩溃并且我得到了致命错误:在展开可选值(lldb)"时意外地发现了nil;在控制台中。

这是我的代码:

这是第一个带有按钮的视图控制器的一部分:

@IBAction func soundButton(sender: AnyObject) {
    var soundID: SystemSoundID = 0
    let soundFile: String = NSBundle.mainBundle().pathForResource("Sound", ofType: "wav")!
    let soundURL: NSURL = NSURL(fileURLWithPath: soundFile)!
    AudioServicesCreateSystemSoundID(soundURL, &soundID)
    AudioServicesPlaySystemSound(soundID)
}

上面是按下按钮时播放声音的动作。

现在这里是按钮的出口,另一个是边框:

 @IBOutlet var soundOutlet: UIButton!
 @IBOutlet var soundRingOutlet: UIImageView!

在故事板中,我有一个标签栏控制器和两个视图(ViewController和ViewControllerTwo),用于访问设置视图(SettingsViewController)我在右下角创建了一个带有齿轮图像的按钮,通过模态显示的segue连接到设置窗格。这里是SettingsViewController代码的一部分:

//The switch
@IBOutlet var soundSwitch: UISwitch!

这里的问题是:

@IBAction func saveButton(sender: AnyObject) { if soundSwitch.on{
    (presentedViewController as! ViewController).soundOutlet.hidden = true} else {(presentedViewController as! ViewController).soundOutlet.hidden = false
    dismissViewControllerAnimated(true, completion: nil)
    }

问题来自" presentsViewController"的第二个实例。到"假" 非常令人沮丧的问题,我已经工作了几个小时,交换代码,研究这个,但似乎没有任何工作。显然,我遗漏了一些东西,毕竟这只是在视图之间交换数据。

更新:我已经改变了我的问题中的两个" presentViewController"以及#34; presentViewController" s。我在控制台中收到此错误消息:"无法转换类型' Buttons.TabBarViewController' (0x10d590d90)到' Buttons.ViewController' (0x10d590e10)。 (LLDB)" "按钮"将是项目名称。

2 个答案:

答案 0 :(得分:1)

目前 ing ViewController是你的tabBarViewController,而现在 ed ViewController就是你期望成为你的ViewController的东西,但实际上这个变量是零,因为at你点击这个按钮的时间点,模态viewcontroller由于某种原因没有设置presentViewController变量,所以变量实际上是nil,当你试图在一个nil变量上运行as! ViewController时,你试图施放nil为了让你得到崩溃,你必须找到一些其他的方法来获取你将要呈现的viewcontroller

答案 1 :(得分:0)

红色,大部分都看起来不错。只是一些提示。

  1. 您不必复制变量声明。

    让soundURL :NSURL = NSURL(fileURLWithPath:soundFile)!

  2. Swift会根据您的作业推断您的类型。

    1. 正如其他人所提到的,请为控制器使用描述性类名。当你试图弄清楚课程的目的时,它会为你节省很多时间。我们都在那里8>)。
    2. 您需要实例化包含soundOutlet属性的控制器实例。类似的东西:

      let dvc = YourControllerClass() 
      dvc.soundOutlet.hidden = true
      dvc.modalTransitionStyle = UIModalTransitionStyle.FlipHorizontal
      dvc.modalPresentationStyle = UIModalPresentationStyle.Popover
      dvc.presentViewController(YourViewController, animated: true, completion: nil)
      

      如果您还没弄明白,请发布更多实施内容。

      祝你好运。