为什么 addTarget 在 Swift 中没有被删除?
Why addTarget does not get removed in 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
对象作为目标。 它return是这个对象。所以如果你想删除它,你应该得到它的 return 值,把它保存在一个 属性 中,这样你就可以将它传递给 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
作为目标。
当我从屏幕返回并再次进入屏幕时,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
对象作为目标。 它return是这个对象。所以如果你想删除它,你应该得到它的 return 值,把它保存在一个 属性 中,这样你就可以将它传递给 removeTarget
.
Call the
addTarget(handler:)
method to add a block to be called. Remove the handler by calling theremoveTarget(_:)
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
作为目标。