class 的实例只返回 nil
Instance of a class only returning nil
对 swift 相当陌生,并且努力在另一个 class 中创建一个 class 的实例。我发出通知,然后在我的应用程序委托中它通过播放音乐播放器和更改我的 viewController 中的标签来响应,但是当它尝试更改标签时应用程序崩溃并出现错误 "Unexpectedly found nil while implicitly unwrapping an Optional value"。我可以通过添加一个 '?' 来绕过它但为什么它变成零了。
代码
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, AVAudioPlayerDelegate {
var musicPlayerManager: MusicPlayerManager = MusicPlayerManager()
var viewController: ViewController = ViewController()
func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
//show an alert window
var playlistName: String = ""
if let userInfo = notification.userInfo {
playlistName = userInfo["soundName"] as! String
}
musicPlayerManager.playPlaylist(chosenPlaylist: playlistName)
print(playlistName)
viewController.currentPlaylist.text = "Playlist: \(playlistName)"
}
}
我在控制台中打印了播放列表名称,然后它在最后一行崩溃,提示这是 viewController 实例的问题,我试图更改视图控制器中的标签来自应用程序委托。
在 vc 加载之前,Outlet 为零,如果它存在,您还需要从情节提要中加载它
viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "id") as! ViewController
viewController.view.layoutIfNeeded()
viewController.currentPlaylist.text = "Playlist: \(playlistName)"
如果您不想使用故事板,您可以在此结构中创建您的 ViewController。但是您需要将 Subview(currentPlaylist) 添加到您的视图中,还需要设置它的框架
import UIKit
class ViewController: UIViewController {
let currentPlaylist = UILabel()
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
init() {
super.init(nibName: nil, bundle: nil)
currentPlaylist.frame = CGRect(x: 0, y: 0, width: 200, height: 50)
view.addSubview(currentPlaylist)
}
}
对 swift 相当陌生,并且努力在另一个 class 中创建一个 class 的实例。我发出通知,然后在我的应用程序委托中它通过播放音乐播放器和更改我的 viewController 中的标签来响应,但是当它尝试更改标签时应用程序崩溃并出现错误 "Unexpectedly found nil while implicitly unwrapping an Optional value"。我可以通过添加一个 '?' 来绕过它但为什么它变成零了。
代码
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, AVAudioPlayerDelegate {
var musicPlayerManager: MusicPlayerManager = MusicPlayerManager()
var viewController: ViewController = ViewController()
func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
//show an alert window
var playlistName: String = ""
if let userInfo = notification.userInfo {
playlistName = userInfo["soundName"] as! String
}
musicPlayerManager.playPlaylist(chosenPlaylist: playlistName)
print(playlistName)
viewController.currentPlaylist.text = "Playlist: \(playlistName)"
}
}
我在控制台中打印了播放列表名称,然后它在最后一行崩溃,提示这是 viewController 实例的问题,我试图更改视图控制器中的标签来自应用程序委托。
在 vc 加载之前,Outlet 为零,如果它存在,您还需要从情节提要中加载它
viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "id") as! ViewController
viewController.view.layoutIfNeeded()
viewController.currentPlaylist.text = "Playlist: \(playlistName)"
如果您不想使用故事板,您可以在此结构中创建您的 ViewController。但是您需要将 Subview(currentPlaylist) 添加到您的视图中,还需要设置它的框架
import UIKit
class ViewController: UIViewController {
let currentPlaylist = UILabel()
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
init() {
super.init(nibName: nil, bundle: nil)
currentPlaylist.frame = CGRect(x: 0, y: 0, width: 200, height: 50)
view.addSubview(currentPlaylist)
}
}