我目前正在开发一款应用,用户必须首次启动该应用。登录将被存储,以便用户在终止后每次打开应用程序时都不需要重做该过程。
我目前正在尝试实施一个注销按钮,删除存储的登录数据和偏好设置,应该重新加载"应用并再次显示登录视图,就像用户从未在第一时间打开应用一样(与您在Spotify等应用中看到的效果相同)。
我已经设法编写第一部分,但是,我真的很难与第二部分。
我遇到这个问题的第一个方法是将UI和变量相关的代码转换为一个单独的函数,该函数在viewDidLoad()中被调用,并将该函数注册为NotificationCenter密钥,以便在注销时通过所有已初始化的类调用触发注销的类的NotificationCenter帖子。
这种方法有点奏效。问题是许多其他Notification Center帖子被多次调用,这导致应用程序在终止和重新启动之前无法正常工作。
我真的无法找到这种行为的理由。虽然,我真的认为,即使它起作用,这也不是实现这一目标的正确方法,因为我重新加载了#34; (在该函数意义上)所有类,而不仅仅是可见的类,从长远来看应该是非常低效的。
你会如何处理这个问题? 我不认为我是唯一一个与此斗争的人。 你知道怎样"受欢迎"应用程序实现了这种效果?
PS:有没有办法去除#34; deinit"一类ViewController?如果可能有尝试的方法吗?
答案 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仍然在内存中,那么这意味着您有内存泄漏。