c# - 如何从 PlayCommand 中删除目标?

标签 c# ios xamarin xamarin.ios avplayer

我正在使用 XamarinMediaManagerXamarin.iOS 上构建 audioPlayer它基于 iOS 上的 AVPlayer

为了从锁定屏幕播放/暂停轨道,我将以下处理程序添加到 PlayCommandPauseCommand,如下所示:

MPRemoteCommandCenter.Shared.PlayCommand.AddTarget(LockScreenPlay);
MPRemoteCommandCenter.Shared.PauseCommand.AddTarget(LockScreenPause);
 //..

 private MPRemoteCommandHandlerStatus LockScreenPlay(MPRemoteCommandEvent arg)
{
  //..
    PlaybackController.Play();
  // ..
}
 private MPRemoteCommandHandlerStatus LockScreenPause(MPRemoteCommandEvent arg)
{
 //..
    PlaybackController.Pause();
 //..
}

问题

当我多次访问 Controller 时,LockScreenPlay/Pause 被执行了几次,我如何在卸载 View 时删除旧的处理程序?

Ps: 我已经在ViewWillDisappear方法中尝试了RemoveTarget:

KMPRemoteCommandCenter.Shared.PlayCommand.RemoveTarget(this);

但是那没有用,我做错了什么?任何帮助,将不胜感激。

最佳答案

MPRemoteCommandCenter.Shared.PlayCommand.AddTarget(LockScreenPlay); 将返回一个 NSObject。如果你想删除这个 Action ,你应该像这样使用这个 api:

// Add play command
playCommand =  MPRemoteCommandCenter.Shared.PlayCommand.AddTarget(LockScreenPlay);
// Remove play command later
MPRemoteCommandCenter.Shared.PlayCommand.RemoveTarget(playCommand);

这样每次添加的命令都需要记录下来。然后在需要时删除它们。

也可以尝试使用OC选择器添加播放指令:

MPRemoteCommandCenter.Shared.PlayCommand.AddTarget(this, new ObjCRuntime.Selector("LockScreenPlay:"));
[Export("LockScreenPlay:")]
private void LockScreenPlay(MPRemoteCommand command)
{
   ...
}

这样,您就可以使用MPRemoteCommandCenter.Shared.PlayCommand.RemoveTarget(this); 来删除您添加的所有命令。暂停命令也是如此。

关于c# - 如何从 PlayCommand 中删除目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50756784/

相关文章:

c# - ASP.NET Core 2+ 中的 ILogger 和 DependencyInjection

c# - Windows 窗体的更新 - C#

iOS 和游戏中心 - 为托管游戏挑选 friend

android - 设置Android DatePicker标题语言

c# - Xamarin 自定义渲染器中的程序集声明

xamarin - 从 UIWebView 迁移到 WKWebView 后性能显着下降

c# - 在 Entity Framework 中查找变更集

c# - 我怎样才能得到哪个类已传递给方法

jquery - 在 iPad 中使用加速度计移动物体

html - 当 SMS 应用程序未在后台运行时,无法在 iPhone 上的 SMS 链接中预填充电话号码和消息正文