注销功能应该是什么样才能重新加载"应用程序?

时间:2017-08-29 12:24:18

标签: ios swift class initialization

我目前正在开发一款应用,用户必须首次启动该应用。登录将被存储,以便用户在终止后每次打开应用程序时都不需要重做该过程。

我目前正在尝试实施一个注销按钮,删除存储的登录数据和偏好设置,应该重新加载"应用并再次显示登录视图,就像用户从未在第一时间打开应用一样(与您在Spotify等应用中看到的效果相同)。

我已经设法编写第一部分,但是,我真的很难与第二部分。

我遇到这个问题的第一个方法是将UI和变量相关的代码转换为一个单独的函数,该函数在viewDidLoad()中被调用,并将该函数注册为NotificationCenter密钥,以便在注销时通过所有已初始化的类调用触发注销的类的NotificationCenter帖子。

这种方法有点奏效。问题是许多其他Notification Center帖子被多次调用,这导致应用程序在终止和重新启动之前无法正常工作。

我真的无法找到这种行为的理由。虽然,我真的认为,即使它起作用,这也不是实现这一目标的正确方法,因为我重新加载了#34; (在该函数意义上)所有类,而不仅仅是可见的类,从长远来看应该是非常低效的。

你会如何处理这个问题? 我不认为我是唯一一个与此斗争的人。 你知道怎样"受欢迎"应用程序实现了这种效果?

PS:有没有办法去除#34; deinit"一类ViewController?如果可能有尝试的方法吗?

1 个答案:

答案 0 :(得分:2)

在我看来,在实施此类行为时,您不应该依赖通知中心。如果要将内存中的所有ViewController替换为单个ViewControllers(例如登录屏幕),则应替换应用程序rootViewController的{​​{1}}。您只需设置属性即可完成此操作:

window

然后致电class YourViewController { static func presentOn(window: UIWindow) { let vc = YourViewController.init(nibName: "YourViewController", bundle: Bundle.main) // or however you want to initialize it window.rootViewController = vc window.makeKeyAndVisible() } }

或者如果您想要动画,请使用自定义segue子类,在该子类中使用自定义动画覆盖YourViewController.presentOn(UIApplication.shared.windows.first!)方法(例如使用snapshot views)。

perform

然后在您的注销ViewController调用class PresentAsRootSegue: UIStoryboardSegue { override func perform() { let window = UIApplication.shared.windows.first! destination.view.frame = window.bounds let snapshot: UIView = destinationView.snapshotView(afterScreenUpdates: true) UIView.animate(withDuration: 1.0, animations: { //do your animations here }, completion: { _ in window.rootViewController = destination window.windowLevel = UIWindowLevelNormal source.dismiss(animated: false, completion: nil) }) } }

如果在更改之后旧的ViewControllers仍然在内存中,那么这意味着您有内存泄漏。