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)
    }
}