【问题标题】:Why addTarget does not get removed in Swift?为什么 addTarget 不会在 Swift 中被删除?
【发布时间】:2021-03-11 07:54:08
【问题描述】:

当我从屏幕返回并再次进入屏幕时,nextTrackCommand 的目标被多次调用,即使我删除了viewWillDisappear 中的目标。我做错了什么?

override func viewDidLoad() {
    super.viewDidLoad()

    UIApplication.shared.beginReceivingRemoteControlEvents()

    MPRemoteCommandCenter.shared().nextTrackCommand.addTarget { [unowned self] (_) -> MPRemoteCommandHandlerStatus in
        print("go to next track")
        return .success
    }
}

override func viewWillDisappear(_ animated: Bool) {
    MPRemoteCommandCenter.shared().nextTrackCommand.removeTarget(self)
}

【问题讨论】:

  • 请注意,viewWillDisappear 并不一定意味着 VC 生命的终结。 VC消失后可能会再次出现。当视图重新出现时,您当前的代码将导致目标保持删除状态。不知道是不是故意的……
  • @Sweeper 是的,谢谢。我把它移到viewDidDisappear
  • viewDidDisappear 在这里无济于事。 @Sweeper 想在您不从 CurrentVC 回来但您要继续使用 NextVC 时帮助您解决这个问题。在这种情况下,viewWillDisappear/viewDidDisappear 将为CurrentVC 触发,并且将被取消订阅。为了解决这个问题,您可以将您的 addTarget 订阅从 viewDidLoad 移动到 viewWillAppear
  • @Legonaftik 是的,我正在使用 viewDidDisappear 和 viewDidAppear
  • @SwiftiSwift 不,你不是。您正在使用viewDidDisappearviewDidLoad。这些不是一对。

标签: ios swift xcode swift5 mpremotecommandcenter


【解决方案1】:

您正在调用的addTarget 的重载不会将self 添加为目标。它添加了一个您之前不知道的NSObject 对象作为目标。 它返回这个对象。所以如果你想删除它,你应该得到它的返回值,把它保存在一个属性中,这样你就可以把它传递给removeTarget

调用addTarget(handler:) 方法添加要调用的块。调用removeTarget(_:)方法移除handler,传入该方法返回的对象。

var target: NSObject?
override func viewDidLoad() {
    super.viewDidLoad()

    UIApplication.shared.beginReceivingRemoteControlEvents()

    target = MPRemoteCommandCenter.shared().nextTrackCommand.addTarget { [unowned self] (_) -> MPRemoteCommandHandlerStatus in
        print("go to next track")
        return .success
    }
}

override func viewWillDisappear(_ animated: Bool) {
    MPRemoteCommandCenter.shared().nextTrackCommand.removeTarget(target)
}

或者,调用other overload,它实际上允许您将self 添加为目标。

【讨论】:

  • 不错,不错。
  • 正如马特所说,很好的答案。 (已投票)。 addTarget(handler:) 似乎是一个名称不佳的方法。它表明它正在使用目标/动作,但它需要一个块并返回一个命令处理程序对象。没有任何目标/行动!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 2019-03-14
  • 2012-01-17
  • 1970-01-01
相关资源
最近更新 更多