swift – 解除ViewController并重新加载之前的传递数据?

swift – 解除ViewController并重新加载之前的传递数据?,第1张

概述我的应用从服务器下载更新.为此,它将设备上的数据与服务器上可用的数据进行比较.如果存在不匹配,则将布尔值“updateAvailable”设置为true,并向用户显示交互式UILabel,指示他们可以下载更新. (略微简化的代码) class ViewController: UIViewController {@IBOutlet weak var updateLabel: UILabel! 我的应用从服务器下载更新.为此,它将设备上的数据与服务器上可用的数据进行比较.如果存在不匹配,则将布尔值“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”的自定义segue:

@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)            }        }     })       }

在解除UpdateVIEwController时,会显示主VIEwController,但“updateAvailable”仍设置为true,并且updateLabel仍处于活动状态.

触发另一个自定义Segue回VIEwController / Root VIEwController对我来说不是一个选项,因为它通过在Stack中创建多个’VIEwController’实例来破坏后台更新提取.

onVIEwDIDAppear()在这种情况下也是不合适的,因为它会导致繁重的网络/服务器流量.

如何解除UpdateVIEwController并重新加载以前的VIEwController或发送回触发VIEwController的updateChecker()方法的数据?或者清除整个VIEwControllerStack并重启应用程序?

我理解代理安排似乎是合适的,但是之前关于这个主题的SO问题和答案如this one是针对Objective-C的,我无法为Swift 2.0调整这些答案.

任何帮助将不胜感激.

解决方法 在UpdateVIEwController中创建一个闭包属性clearUpdateAvailable:

class UpdateVIEwController: UIVIEwController {  var clearUpdateAvailable: (()->())?  overrIDe func vIEwWilldisappear(animated: Bool) {    super.vIEwWilldisappear(animated)    clearUpdateAvailable?()  }}

您可以在vIEwWilldisappear中或从服务器接收数据的方法中调用clearUpdateAvailable.

在VIEwController中,在按ID显示UpdateVIEwController时提供闭包.

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)}
总结

以上是内存溢出为你收集整理的swift – 解除ViewController并重新加载之前的/传递数据?全部内容,希望文章能够帮你解决swift – 解除ViewController并重新加载之前的/传递数据?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1003880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存