【问题标题】: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 警告:尝试在 谁的视野不在窗内 等级制度!
-- 认证过程结束


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

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

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

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

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

【问题讨论】:

    标签: ios swift uiview swift3


    【解决方案1】:

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

    class LoginViewController: UIViewController {
        static let sharedInstance = LoginViewController()
    
        func showNextView() {
            ...
            // presentation call
            self.present(eventVC, animated: false, completion: nil)
        }
    

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

    【讨论】:

    • 谢谢@dvdblk!我会试试。你觉得我用的方法怎么样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多