从班级更改当前视图的最佳实践
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 class
的processAuth()
函数中发送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!我会试试。你觉得我用的方法怎么样?以上是关于从班级更改当前视图的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章