ios - 我可以将私有变量传递给将通过 Storyboard 实例化的 UIViewController 吗?
问题描述
我有一个“根”UIViewController,它本身实例化了另外两个 UIViewController。但是,我需要将一些东西传递给其中的每一个,这必须在初始化时完成。
但
所有 3 个 UIViewController 都通过 Storyboard 实例化。
这可能吗?或者我应该看看其他一些设计模式来传递这些数据?
具体来说,我试图避免紧密耦合,但是“根”正在实例化的 2 个 UIViewController 彼此不了解,但在两者中,都要求他们知道变量的值。
我可以使这个变量成为“根”上的静态变量,但这会强制耦合。
我可以制作一个全局“常量”快速文件并将变量放在那里,但这看起来很脏而且很笨拙。
理想情况下,我想在实例化时将此变量传递给这些 UIViewController 中的每一个,但由于它们都是从 Storyboard 加载的,所以我无法让它工作。
我看过关于类似事情的博客和堆栈帖子,例如
https://blog.scottlogic.com/2014/11/20/swift-initialisation.html
但我还没有看到一个决定性的方法。
我会以错误的方式解决这个问题吗?
下面的“示例”代码显然不起作用,但它在那里向您展示了我正在尝试做的事情,当然条件是所有这三个 UIViewController 在 Interface Builder 中都有一个条目,并使用 Storyboard 中的条目进行实例化...
class root : UIViewController
{
private let a: CGFloat = 1.0
private let b: CGFloat = 10.0
private let vc1: firstViewController
private let vc2: secondViewController
override init()
{
self.vc1 = firstViewController(a: a, b: b)
self.vc2 = secondViewController(a: a, b: b)
super.init
}
}
class firstViewController : UIViewController
{
private let a: CGFloat
private let b: CGFloat
init(a: CGFloat, b: CGFloat)
{
self.a = a
self.b = b
super.init(aDecoder: Decoder)
}
}
这也归结为如何“链接” UIViewController 实例化......我还没有找到关于它的博客或教程或解释。
感谢您的任何帮助/建议。
解决方案
典型的解决方案是实现prepare(for:sender:)
,这使您有机会在目标视图控制器中设置属性。如果你想让它们保持松耦合,你可以使用一个协议:
protocol DataDestination {
var a: CGFloat? { get set }
var b: CGFloat? { get set }
}
class RootViewController: UIViewController {
private let a: CGFloat = 1.0
private let b: CGFloat = 10.0
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? DataDestination {
destination.a = a
destination.b = b
}
}
}
class FirstViewController: UIViewController, DataDestination {
var a: CGFloat?
var b: CGFloat?
override func viewDidLoad() {
super.viewDidLoad()
print(a,b) // by the time we hit this, those will be set
}
}
显然,您会给您的协议起一个更有意义的名称,但我们可能想更多地了解该应用程序以提出更好的建议。
推荐阅读
- java - PostgreSQL中的错误映射几何类型点
- java - 如何验证订阅 - Google 订阅
- django - Django:将 AbstractUser 类上的“date_joined”字段转换为仅月和年精度
- p5.js - 如何在两个对象(火箭船和射击)之间创建独立性?
- python - 如何将使用 ctypes 调用的 C 函数返回的指针转换为 numpy 数组?
- google-sheets - 如何使用 Google Script 中的 Sheet Converter 函数在 HTML 表格中创建可点击链接
- node.js - 用app登录需要注意什么?
- dart - 尝试在 dart 中加载 ffmpeg 库时出错
- c# - C# 使用 ref 参数作为“in-out”参数来返回/交换引用?
- python - 使用 matplotlib (python) 在 xy 坐标系中绘制多个时间序列