ios - 为什么 addTarget 在 Swift 中没有被删除?

当我从屏幕导航回来并再次进入屏幕时,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)
}

最佳答案

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

Call the addTarget(handler:) method to add a block to be called. Remove the handler by calling the removeTarget(_:) method, passing in the object returned by this method.

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 添加为目标。

https://stackoverflow.com/questions/65055851/

相关文章:

linux-kernel - linux cdc_ecm 驱动程序与 rndis 驱动程序

git - Git 中基于内容的寻址有什么好处?

ansible - 删除文件夹文件夹内早于 x 天的文件

algorithm - GPU 上的线性排序。并行处理会改变 Big-O 吗?

list - 如何将列表合并到 Elixir 中的元组列表中?

xml - 如何使用 ConvertTo-Xml 和 Select-Xml 加载或读取 XML 文件

python - 将 2 个字节从字节数组转换为一个整数

git - 为什么我没有得到相同的 SHA-1?

linux - 如何使用 xargs 将 ls 通过管道传输到 cat 中,以便列出文件名?

angular - 如何在 ngBootstrap 和 Angular 中监听模态的关闭事件?