关闭 ViewController 并重新加载以前的数据/传回数据?
Dismiss ViewController AND reload previous / pass data back?
我的应用程序从服务器下载更新。为此,它将设备上的数据与服务器上可用的数据进行比较。如果不匹配,布尔值 'updateAvailable' 将设置为 true,并向用户显示交互式 UILabel,指示他们可以下载更新。
(稍微简化的代码)
class ViewController: UIViewController {
@IBOutlet weak var updateLabel: UILabel!
func updateChecker(){
let deviceVersion = self.settingsController.getDeviceVersion()
//Get Server Version (Async)
_ = settingsController.getServerVersion() { (data) -> () in
dispatch_async(dispatch_get_main_queue()){
if deviceVersion != data{
self.updateAvailable = true
}
else{
self.updateAvailable = false
}
//Update UI
self.updateUI()
}
}
}
func updateUI(){
if updateAvailable{
updateLabel.text = "Update Available"
}
else{
updateLabel.text = "App Up To Date"
}
}
触摸此更新标签时,应用程序会触发 'updateViewController' 的自定义转场:
@IBAction func getUpdateLabelPressed(sender: UITapGestureRecognizer) {
if updateAvailable{
self.performSegueWithIdentifier("segueToUpdateView", sender: self)
}
UpdateViewController 从服务器(异步)下载数据然后被关闭:
class UpdateViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
//Create Settings Controller + Get Update
let sc = SettingsController()
sc.getUpdate({ (success) -> () in
if success{
dispatch_async(dispatch_get_main_queue()){
print("Update Success")
self.dismissViewControllerAnimated(true, completion: nil)
}
}
else{
dispatch_async(dispatch_get_main_queue()){
print("Update Failed")
self.dismissViewControllerAnimated(true, completion: nil)
}
}
})
}
关闭更新ViewController,显示主 ViewController,但 'updateAvailable' 仍设置为 true,并且 updateLabel 仍处于活动状态。
触发另一个自定义 Segue 回到 ViewController / Root ViewController 对我来说不是一个选项,因为这会通过在中创建多个 'ViewController' 实例来中断后台更新获取堆栈。
onViewDidAppear() 在这种情况下也不合适,因为它会导致大量网络/服务器流量。
我怎样才能关闭更新ViewController AND 重新加载之前的 ViewController OR 发回数据触发 ViewController 的 updateChecker() 方法? 或清除整个ViewController堆栈并重新启动应用程序?
我知道委托安排似乎是合适的,但是之前关于此主题的 SO 问题和答案(例如 this one 是针对 Objective-C 的,我无法将这些答案改编为 Swift 2.0.
如有任何帮助,我们将不胜感激。
将您的主要 ViewController
传递给 prepareForSegue
方法中的 UpdateViewController
。
完成更新后,更新 ViewController
控制器的 updateAvailable
标志。
这种方式在关闭和出现主要 ViewController
时 ViewController 中的 updateAvailable 将是 YES
。
Remember to set the accessibilty for the updateAvailable flag and the
reference of the ViewController in UpdateViewController to public. to
be able to update those values out side of the class.
在更新中创建闭包属性 clearUpdateAvailable
ViewController:
class UpdateViewController: UIViewController {
var clearUpdateAvailable: (()->())?
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
clearUpdateAvailable?()
}
}
您可以在 viewWillDisappear 或从服务器接收数据的方法中调用 clearUpdateAvailable
。
在 ViewController 中,在按 ID 显示更新ViewController 时提供闭包。
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let updateViewController = storyboard.instantiateViewControllerWithIdentifier("updateViewController") as? UpdateViewController {
updateViewController.clearUpdateAvailable = { [weak self] in
self?.updateAvailable = false
self?.updateUI()
}
presentViewController(updateViewController, animated: true, completion: nil)
}
我的应用程序从服务器下载更新。为此,它将设备上的数据与服务器上可用的数据进行比较。如果不匹配,布尔值 'updateAvailable' 将设置为 true,并向用户显示交互式 UILabel,指示他们可以下载更新。
(稍微简化的代码)
class ViewController: UIViewController {
@IBOutlet weak var updateLabel: UILabel!
func updateChecker(){
let deviceVersion = self.settingsController.getDeviceVersion()
//Get Server Version (Async)
_ = settingsController.getServerVersion() { (data) -> () in
dispatch_async(dispatch_get_main_queue()){
if deviceVersion != data{
self.updateAvailable = true
}
else{
self.updateAvailable = false
}
//Update UI
self.updateUI()
}
}
}
func updateUI(){
if updateAvailable{
updateLabel.text = "Update Available"
}
else{
updateLabel.text = "App Up To Date"
}
}
触摸此更新标签时,应用程序会触发 'updateViewController' 的自定义转场:
@IBAction func getUpdateLabelPressed(sender: UITapGestureRecognizer) {
if updateAvailable{
self.performSegueWithIdentifier("segueToUpdateView", sender: self)
}
UpdateViewController 从服务器(异步)下载数据然后被关闭:
class UpdateViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
//Create Settings Controller + Get Update
let sc = SettingsController()
sc.getUpdate({ (success) -> () in
if success{
dispatch_async(dispatch_get_main_queue()){
print("Update Success")
self.dismissViewControllerAnimated(true, completion: nil)
}
}
else{
dispatch_async(dispatch_get_main_queue()){
print("Update Failed")
self.dismissViewControllerAnimated(true, completion: nil)
}
}
})
}
关闭更新ViewController,显示主 ViewController,但 'updateAvailable' 仍设置为 true,并且 updateLabel 仍处于活动状态。
触发另一个自定义 Segue 回到 ViewController / Root ViewController 对我来说不是一个选项,因为这会通过在中创建多个 'ViewController' 实例来中断后台更新获取堆栈。
onViewDidAppear() 在这种情况下也不合适,因为它会导致大量网络/服务器流量。
我怎样才能关闭更新ViewController AND 重新加载之前的 ViewController OR 发回数据触发 ViewController 的 updateChecker() 方法? 或清除整个ViewController堆栈并重新启动应用程序?
我知道委托安排似乎是合适的,但是之前关于此主题的 SO 问题和答案(例如 this one 是针对 Objective-C 的,我无法将这些答案改编为 Swift 2.0.
如有任何帮助,我们将不胜感激。
将您的主要 ViewController
传递给 prepareForSegue
方法中的 UpdateViewController
。
完成更新后,更新 ViewController
控制器的 updateAvailable
标志。
这种方式在关闭和出现主要 ViewController
时 ViewController 中的 updateAvailable 将是 YES
。
Remember to set the accessibilty for the updateAvailable flag and the reference of the ViewController in UpdateViewController to public. to be able to update those values out side of the class.
在更新中创建闭包属性 clearUpdateAvailable
ViewController:
class UpdateViewController: UIViewController {
var clearUpdateAvailable: (()->())?
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
clearUpdateAvailable?()
}
}
您可以在 viewWillDisappear 或从服务器接收数据的方法中调用 clearUpdateAvailable
。
在 ViewController 中,在按 ID 显示更新ViewController 时提供闭包。
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let updateViewController = storyboard.instantiateViewControllerWithIdentifier("updateViewController") as? UpdateViewController {
updateViewController.clearUpdateAvailable = { [weak self] in
self?.updateAvailable = false
self?.updateUI()
}
presentViewController(updateViewController, animated: true, completion: nil)
}