如何在两个视图控制器之间传递(更改)变量?

时间:2019-07-24 19:18:58

标签: swift variables uiviewcontroller

我有两个视图控制器。 VC1VC2VC1传递了一个变量,该变量在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{},但是那样行不通。

2 个答案:

答案 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
    }
    // ...
}