在单个文件中定义的多个视图控制器中使用属性,可以通过以下几种方式实现:
如果你希望在多个视图控制器之间共享某些属性,可以将这些属性定义为类的静态属性或类属性。
class ViewController: UIViewController {
static var sharedProperty: String = "Shared Value"
override func viewDidLoad() {
super.viewDidLoad()
print(ViewController.sharedProperty)
}
}
class AnotherViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print(ViewController.sharedProperty)
}
}
委托模式是一种设计模式,可以在一个对象中定义一个接口,让其他对象实现这个接口,并在需要的时候调用这些方法。
protocol ViewControllerDelegate: AnyObject {
var sharedProperty: String { get set }
}
class ViewController: UIViewController, ViewControllerDelegate {
var sharedProperty: String = "Shared Value"
override func viewDidLoad() {
super.viewDidLoad()
let anotherVC = AnotherViewController(delegate: self)
print(anotherVC.sharedProperty)
}
}
class AnotherViewController: UIViewController {
weak var delegate: ViewControllerDelegate?
var sharedProperty: String {
return delegate?.sharedProperty ?? ""
}
override func viewDidLoad() {
super.viewDidLoad()
print(sharedProperty)
}
}
闭包是一种可以捕获和存储上下文中自由变量的匿名函数,可以用来在多个视图控制器之间共享状态。
class ViewController: UIViewController {
var sharedProperty: String = "Shared Value"
override func viewDidLoad() {
super.viewDidLoad()
let anotherVC = AnotherViewController { [weak self] in
return self?.sharedProperty ?? ""
}
print(anotherVC.sharedProperty)
}
}
class AnotherViewController: UIViewController {
let getProperty: () -> String
init(getProperty: @escaping () -> String) {
self.getProperty = getProperty
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
var sharedProperty: String {
return getProperty()
}
override func viewDidLoad() {
super.viewDidLoad()
print(sharedProperty)
}
}
单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。
class SharedManager {
static let shared = SharedManager()
var sharedProperty: String = "Shared Value"
private init() {}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print(SharedManager.shared.sharedProperty)
}
}
class AnotherViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print(SharedManager.shared.sharedProperty)
}
}
[weak self]
或 [weak delegate]
来解决。DispatchQueue
或 NSLock
来确保线程安全。class SharedManager {
static let shared = SharedManager()
var sharedProperty: String = "Shared Value"
private init() {}
func updateProperty(_ newValue: String) {
DispatchQueue.main.async {
self.sharedProperty = newValue
}
}
}
通过以上方法,可以在单个文件中定义的多个视图控制器中有效地使用属性。
领取专属 10元无门槛券
手把手带您无忧上云