如何在iOS中拥有持久视图?

时间:2011-10-14 13:55:03

标签: objective-c ios cocoa-touch uiviewcontroller uinavigationcontroller

我们正在使用UInavigationController,其中一个视图是播放音轨的视图。

我们正在使用AVfountation框架。

我们在点击按钮

时导航到audiolist(播放音乐)
-(IBAction)audioBtnClicked
{
    audiolist *audio=[[audiolist alloc] initWithNibName:@"audiolist" bundle:nil];
    [self.navigationController pushViewContrller:audio animated:YES];
    [audiolist release];
}

当用户播放音乐并导航时,音乐会继续播放

问题:当用户导航回歌曲列表并播放另一首曲目时, 2首歌曲同时播放。

我们认为每次用户导航时都会创建audiolist的新实例。 我们希望只有audiolist的一个实例。我们如何使audiolist的第一个实例持久化,我们如何回顾它?

2 个答案:

答案 0 :(得分:1)

你必须做

[audio release];

而不是

[audiolist release];
音响大师似乎是你的班级名字。命名约定说类应该是大写和驼峰,所以它应该是AudioList。它会让你的代码更具可读性。

要拥有AudioList的单个共享实例,您可以这样做:

在标题中添加一个类方法:

+ (AudioList *) sharedInstance;

然后将其添加到您的实现文件中:

@implementation AudioList

static AudioList *gSharedInstance = nil;

+ (AudioList *) sharedInstance {
    if (gSharedInstance == nil) {
        gSharedInstance = [[AudioList alloc] init];
    }

    return gSharedInstance;
}

现在您始终可以使用

访问该实例
[AudioList sharedInstance];

干杯。

答案 1 :(得分:0)

创建一个单一的AudioManager类来处理所有音乐播放。当您导航到该视图控制器时,抓取该AudioManager的共享实例以执行您在该视图中执行的任何操作。

您不希望视图持久存在,因为这会导致MVC分离错误。

Apple讨论了不同的设计模式及其Objective-c实现,包括单例:

http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/CocoaDesignPatterns.html#//apple_ref/doc/uid/TP40002974-CH6-SW6