首页 > 解决方案 > 登录后在“didInitiate”函数中访问 ViewController UI

问题描述

Mac OS 版本:Mojave - 10.14.3

XCode 版本:10.1

测试:ios 12.1 (iphone 8) & ios 10.3.3 (iphone 5c)

我设法让身份验证工作,一切正常我可以使用他们的访问令牌从用户那里获取数据。

我唯一的问题是在成功验证后尝试更新当前视图控制器上的 UI 值,display_name在应用程序从 Spotify 应用程序或 SFSafariViewController 的验证阶段返回后,我的 UI 标签变为 nil。有什么方法可以更新display_name内部的 didInitiate 吗?

奇怪的部分是它在模拟中完美运行:DispatchQueue.main.async有效,但在真实设备上无效

// In my ViewController.swift
class ViewController: UIViewController, SPTSessionManagerDelegate {
    @IBOutlet weak var display_name: UILabel!

    //protocol stubs for 'SPTSessionManagerDelegate'
    func sessionManager(manager: SPTSessionManager, didInitiate session: SPTSession)
    {
        print("success", session)

        DispatchQueue.main.async {
            self.display_name.text = "data from api" // Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
        }
    }
...

// In my AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    lazy var rootViewController = ViewController()
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        rootViewController.sessionManager.application(app, open: url, options: options)
        print("application func")
        return true
    }
...

标签: iosswiftxcodeapispotify

解决方案


推荐阅读