ios - 在不移动 ViewController 的情况下将数据推送到另一个 ViewController
问题描述
我对 Swift 编码比较陌生。我正在尝试将数据传递回另一个视图控制器,而不必转到该控制器,以便用户可以留在同一屏幕上。我正在研究使用委托,并想知道这是否是在多个视图控制器上访问变量的最佳方式。谢谢
视图控制器 1:
func passVariables() {
let passSleepValue = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sbHome") as! sbHomeController
passSleepValue.getSleepValue = sleepValue
//navigationController?.pushViewController(passSleepValue, animated: true)
}
视图控制器 2:
func updateDay() {
let dayScoreAvg = getSleepValue
dayScore.text = String(format: "%.1f", dayScoreAvg)
print("Get sleep Value is \(getSleepValue)")
}
解决方案
看起来您已经可以将数据传递给第二个 ViewController,但您不能将一些数据传回。
所以一种方法是使用委托模式。
从使用传递数据的方法声明委托协议开始(在您的情况下,它可以只是传递String
)
protocol SecondVCDelegate: class {
func passText(_ text: String)
}
delegate
然后在第二个 ViewController 中创建变量
class SecondViewController: UIViewController {
weak var delegate: SecondVCDelegate?
...
}
现在您可以将此协议实现到第一个 ViewController
extension ViewController: SecondVCDelegate {
func passText(_text: String) {
// do something with text passed from second VC
}
}
现在设置delegate
Second VC,就像self
你推它之前一样
func passVariables() {
let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sbHome") as! sbHomeController
viewController.getSleepValue = sleepValue
viewController.delegate = self
navigationController?.pushViewController(viewController, animated: true)
}
然后在第二个VC中你可以调用你的方法delegate
,在第一个VC中这个方法被调用
delegate?.passText("Hello First!")
推荐阅读
- unit-testing - 如何以几乎 100% 的覆盖率对此类进行单元测试?
- javascript - 通过动画从高度 0 到高度 100%
- postgresql - 使用 Postgres 排除约束限制匹配特定条件的表行数?
- c - OpenMP 并行化随机序列
- firebase - 使用 Firebase currentUser 持续登录不工作 - Flutter 应用程序
- reactjs - 如何告诉 webpack 忽略重复的包?
- google-ads-api - 无法从 Google Ads API for HTML5 Ads 获取图片网址
- java - 带有二维数组的 Java 流
- java - 在片段中设置蓝牙接口
- batch-file - Bat File 等待远程输入