我有两个视图控制器。 VC1
和VC2
。 VC1
传递了一个变量,该变量在VC1
上每秒不断地更改和更新,在我的情况下,它是由VC1
中的方法处理的最近的信标。
VC1
代码:
var id: Int = 0 // initializing
// send data to VC2
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let vc2 = segue.destination as? navigationScreenVC else { return }
vc2.id2 = id
}
VC2
代码:
var id2: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
print(VC2)
}
它在发送遇到的第一个值的地方工作,但是在值不断变化时不起作用,因此我希望在触发更改后立即发送该值。
我尝试做didSet{}
,但是那样行不通。
答案 0 :(得分:3)
使用委托模式。
在VC2中:
protocol VC2Delegate: class {
var id2: Int { get }
}
class VC2 {
weak var delegate: VC2Delegate?
override func viewDidLoad() {
super.viewDidLoad()
print(delegate?.id2)
}
}
在VC1中:
class VC1: UIViewController, VC2Delegate {
...
var id2: Int = 0
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let vc2 = segue.destination as? navigationScreenVC else { return }
vc2.delegate = self
}
...
}
答案 1 :(得分:1)
ViewController停止可见后,不应再对其进行管理。您应该在一个单独的类中进行管理,并等待委托进行更新,让我们说:
protocol BeaconUpdateListener : AnyObject {
func currentBeaconIdWasUpdated(to newValue: Int)
}
class BeaconManager {
struct DelegateWrapper {
weak var delegate : BeaconUpdateListener?
}
static let delegates = [DelegateWrapper]()
static var currentId : Int = -1 {
didSet {
delegates.forEach { (delegate) in
delegate.delegate?.currentBeaconIdWasUpdated(to: currentId)
}
}
}
}
示例代码,缺少详细信息。您可以自己制作或更新。现在,将这些数据保存在UI代码之外,可以更轻松地在其他任何地方使用它,并在将来进行更新。这样,您可以“订阅”这样的ID更新:
BeaconManager.delegates.append(OBJECT_THAT_NEEDS_TO_BE_NOTIFIED)
...像这样更新您的ID:
BeaconManager.currentId = 65421687543152
...并等待这样的更新:
class VC2 : ViewController, BeaconUpdateListener {
func currentBeaconIdWasUpdated(to newValue: Int) {
// Do stuff once i receive the update
}
// ...
}