【发布时间】:2015-07-08 06:28:34
【问题描述】:
我只使用 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)
}
问题是从“presentedViewController”的第二个实例变为“false” 非常令人沮丧的问题,我已经为此工作了几个小时,交换了代码,研究了这个,但似乎没有任何效果。显然我缺少一些东西,毕竟这只是在视图之间交换数据。
更新:我已将问题中的两个“presentedViewController”改为“presentingViewController”。我在控制台中收到此错误消息:“无法将 'Buttons.TabBarViewController' (0x10d590d90) 类型的值转换为 'Buttons.ViewController' (0x10d590e10)。 (lldb)" “Buttons”是项目名称。
【问题讨论】:
-
不就是
presentedViewController是nil吗? -
你正在升级你的 VC:
presentedViewController as! ViewController。丢失其中的属性(包括soundOutlet)。 -
@Ichamp 有没有其他方法可以从我的应用程序的另一个视图访问代码而无需向上转换?
-
详细解释请参考以下链接。重复问题。 stackoverflow.com/a/32170457/6602495
标签: ios swift cocoa-touch ios8