从班级更改当前视图的最佳实践

Posted

技术标签:

【中文标题】从班级更改当前视图的最佳实践【英文标题】:Best practice to change current view from a class 【发布时间】:2017-03-18 20:02:41 【问题描述】:

我正在使用 Swift 3,我想在登录成功时从我的类中的一个函数更改我的视图。

我有一个 LoginViewController 包含这个功能:

static let sharedInstance = LoginViewController()

//...

func showNextView() 
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        guard let eventVC = storyboard.instantiateViewController(
            withIdentifier: "EventsTVC") as? EventsTableViewController else 
                assert(false, "Misnamed view controller")
                return
    
    self.present(eventVC, animated: false, completion: nil)

在我的班级 APIManager 中,我使用 Alamofire 在我的异步方法中调用此函数:

func processAuth(_ data: [String: String]) 
    print("-- auth process started")

    //... defining vars

    Alamofire.request(tokenPath, method: .post, parameters: tokenParams, encoding: JSONEncoding.default, headers: tokenHeader)
        .responseJSON  response in
            guard response.result.error == nil else 
                print(response.result.error!)
                return
            

            guard let value = response.result.value else 
                print("No string received in response when swapping data for token")
                return
            

            guard let result = value as? [String: Any] else 
                print("No data received or data not JSON")
                return
            

            // -- HERE IS MY CALL
            LoginViewController.sharedInstance.showNextView()

            print("-- auth process ended")
    

我的控制台返回此错误消息:

-- 身份验证过程已启动 2017-03-18 20:38:14.078043 警告:尝试在 谁的视野不在窗内 等级制度! -- 认证过程结束


我认为当我的异步方法结束时改变我的视图不是最佳做法。

我不知道我要做什么。目前,流程如下:

    用户打开应用程序并显示LoginViewController,如果没有保存令牌(Facebook 登录) 在必须登录的情况下,会显示“使用 Facebook 登录”按钮 登录成功后,我在APIManager classprocessAuth() 函数中发送Facebook 数据 当我的 API 返回令牌时,我将其保存并将视图更改为 EventsTVC

我用粗体表示问题所在。我想知道这是否是我的最佳做法。如果是这样,如何避免我的错误信息?

我希望我能理解自己。感谢您的帮助!

【问题讨论】:

【参考方案1】:

实际发生的情况是您的单例实例LoginViewController 想要在不在视图层次结构中的情况下展示自己。让我彻底解释一下:

class LoginViewController: UIViewController 
    static let sharedInstance = LoginViewController()

    func showNextView() 
        ...
        // presentation call
        self.present(eventVC, animated: false, completion: nil)
    

在这个函数中,你从你的单例实例调用present()。您必须从(最好)位于视图层次结构堆栈顶部的视图中调用它。解决方案可能首先不在 VC 上使用单例。您应该从当前屏幕上的 VC 实例化并呈现它。希望这会有所帮助!

【讨论】:

谢谢@dvdblk!我会试试。你觉得我用的方法怎么样?

以上是关于从班级更改当前视图的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

处理容器控制器中子视图控制器的 UINavigationItem 更改的最佳实践?

将当前用户数据从本地存储存储到vue存储的最佳实践?

最佳实践:方向更改期间的 AsyncTask

将领域与回收者视图一起使用的最佳实践?

视图验证的MVC最佳做法?

最佳实践 - 从视图访问域对象列表?