Ios 为什么addTarget不会在Swift中删除?

Ios 为什么addTarget不会在Swift中删除?,ios,swift,xcode,swift5,mpremotecommandcenter,Ios,Swift,Xcode,Swift5,Mpremotecommandcenter,当我从屏幕返回并再次进入屏幕时,nextTrackCommand的目标会被多次调用,即使我在视图中删除目标也会消失。我做错了什么 override func viewDidLoad(){ super.viewDidLoad() UIApplication.shared.beginReceivingRemoteControlEvents() MPRemoteCommandCenter.shared().nextTrackCommand.addTarget{[unowned self](\ux)->

当我从屏幕返回并再次进入屏幕时,
nextTrackCommand
的目标会被多次调用,即使我在
视图中删除目标也会消失。我做错了什么

override func viewDidLoad(){
super.viewDidLoad()
UIApplication.shared.beginReceivingRemoteControlEvents()
MPRemoteCommandCenter.shared().nextTrackCommand.addTarget{[unowned self](\ux)->中的MPRemoteCommandHandlerStatus
打印(“转到下一曲目”)
回报,成功
}
}
覆盖函数视图将消失(u动画:Bool){
MPRemoteCommandCenter.shared().nextTrackCommand.removeTarget(自)
}
您正在调用的重载不会将
self
添加为目标。它添加了一个以前不知道的
NSObject
对象作为目标。它返回这个对象。因此,如果要删除它,应该获取其返回值,将其保存在属性中,以便将其传递给
removeTarget

调用
addTarget(处理程序:)
方法添加要调用的块。通过调用
removeTarget(:)
方法,传入此方法返回的对象,来删除处理程序


或者,打电话,实际上可以让你添加
自我
作为目标。

发现得好,回答得好。正如马特所说,回答得好。(投票)
addTarget(handler:)
似乎是一个名称不正确的方法。它表明它正在使用target/action,但它接受一个块并返回一个命令处理程序对象。没有任何目标/行动!请注意,
视图将消失
并不一定意味着VC生命的终结。风投可能在消失后再次出现。当前代码将使目标在视图重新出现时保持删除状态。我不知道这是不是有意的…@清扫者是的,谢谢。我把它移到了
viewdidense
viewdidense
这里没有帮助@当您不从
CurrentVC
返回,而是转到某个
NextVC
时,Sweeper想帮您解决这个问题。在这种情况下,
CurrentVC
将触发
viewWillEnglishe/viewDidEnglish
,并取消订阅。为了解决这个问题,您可以将
addTarget
订阅从
viewdiload
移动到
viewwillbeen
@Legonaftik是的,我正在使用viewdiload和viewDidAppear@SwiftiSwift不,你不是。您使用的是
viewdiddemouse
viewDidLoad
。那些不是配对的。
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)
}