我将要构建这个应用程序,用户可以在其中收听 uiTableView 中填充的轨道。当用户点击一行时,它应该通知其他类(我的音频播放器)有关此操作等。加载 mp3 网址。
我选择在导航 Controller 前面有一个 View Controller 的原因很简单。我需要在每个 View Controller 上显示一个持久 View (我的音频播放器,标记为深灰色),我发现这个解决方案最简单。 我这里的问题是如何告诉音频播放器类关于 trackTableView 中发生的操作。我知道您可以使用委托(delegate),但不知道当中间有一个 navigationController 时如何以正确的方式完成它。
我考虑过的另一件事是将音频播放器作为单例使用(无论如何都会像这样,因为我只需要一个音频播放器实例)然后在需要时调用单例方法.
处理它的最佳方法是什么,单例方法还是委托(delegate)?在这种情况下如何进行授权?
最佳答案
通常委托(delegate)是一个很好的模式,因为它是“最干净”的方式。接口(interface)都是设计等。
这种情况下的问题是,当您启动 tableview 的委托(delegate)时,您需要设置(您的)audioplayer 委托(delegate)。因此,您需要在代码的其他地方引用音频播放器。出于这个原因,我建议使用单例。
我想谈的最后一个模式是使用通知(NSNotificationCenter + NSNotification)。通常,您不只是想在用户选择新标题等时控制您的音频播放器,而且还会发生其他事情,例如更新播放列表、更新显示正在发生的事情的 View 等。
如果这些东西都在您代码的不同部分(而不是由您的音频播放器直接控制),那么通知也将非常方便!
对于最佳实践,我建议:从中央单例控制所有用于显示和管理播放列表的代码。如果这不是您所做的,请使用通知!
如果你不知道 NSNotificationCenter 是如何工作的,这里有一个简短的代码示例:
[[NSNotificationCenter defaultCenter] postNotificationName:@"START_MUSIC" object:nil userInfo:nil];
这将向所有等待名为 @"START_MUSIC"
的通知的听众发布通知。如果您需要提供额外的数据,例如选择了哪首歌等,您可以创建一个 NSDictionary
并将其添加到 userInfo
参数(我在此将其保留为 nil例)
然后在另一个你想接收这个通知的类中调用
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startMusic:) name:@"START_MUSIC" object:nil];
你必须实现
- (void)startMusic:(NSNotification *)notification
{
// if you provided some extra information, this is where you get your dictionary!
NSDictionary* userInfo = notification.userInfo;
}
当这个对象被释放时,你也应该停止监听通知!因此,将其添加到您的 -(void)dealloc
方法中:
- (void)dealloc
{
// rest of your dealloc code!
[[NSNotificationCenter defaultCenter] removeObserver:self];
// if not using ARC:
// [super dealloc]
}
一般来说如果你想停止监听通知可以使用通知中心的-(void)removeObserver:(id)observer
方法或者其他更详细的方法(比如停止监听)具体通知)。如果您只是调用此通用方法,您将停止使用此对象监听所有通知。
关于ios - 在 iOS 中通知 A 类关于 B 类的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756861/