保存或返回到以前的iOS场景

保存或返回到以前的iOS场景,ios,objective-c,uiviewcontroller,xcode5,segue,Ios,Objective C,Uiviewcontroller,Xcode5,Segue,我现在有一个iOS应用程序在一个有3个ViewController的故事板中运行。第一个(初始视图)具有播放按钮,用于启动音乐流和当前播放歌曲的专辑封面图像。这个场景有一个导航控制器和一个条形按钮,可以引导用户进入下一个视图 由硬编码流填充的列表视图,用户可以从中进行选择。非常简单,工作仍然很好 选择一个后,用户进入预览页面,在开始播放之前告诉他们有关流的信息。在他们想从这里继续之前,他们仍然像一个魔咒一样工作 如果用户从预览页面选择流,应用程序“应该”将用户返回到初始ViewControlle

我现在有一个iOS应用程序在一个有3个ViewController的故事板中运行。第一个(初始视图)具有播放按钮,用于启动音乐流和当前播放歌曲的专辑封面图像。这个场景有一个导航控制器和一个条形按钮,可以引导用户进入下一个视图

由硬编码流填充的列表视图,用户可以从中进行选择。非常简单,工作仍然很好

选择一个后,用户进入预览页面,在开始播放之前告诉他们有关流的信息。在他们想从这里继续之前,他们仍然像一个魔咒一样工作

如果用户从预览页面选择流,应用程序“应该”将用户返回到初始ViewController,并将播放流替换为所选流。起初,我错误地创建了初始viewController的一个新实例,在修复了这个错误后,现在我有了一些其他人可以帮助我的问题

以下是用于选择流的按钮的iAction:

- (IBAction)returnHome:(id)sender 
{
    [[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack
}
在找到这个逻辑之前,我使用了prepareForSegue并将目的地的流值设置为所选择的值。我还试图保存第一个视图的状态,但不确定如何将其传递到下一行(或保留它),因为我正在移动3个视图控制器,并使用一个模式序列,以便它们在选择不拾取新流时可以返回


任何建议都会有所帮助,但请不要简单地发布参考链接。我已经在那里呆了三天了,在iOS参考文档中,他们说的不是一个非常适合初学者的行话。

我至少已经想出了如何让它工作的方法。我在故事板中有第二个导航控制器,删除后,它成功返回了两个视图,而不是一个

下面是我的逻辑,用于保留流数据,并在有人好奇时将其带回初始视图控制器

- (IBAction)returnHome:(id)sender
{
    ViewController *vc = (ViewController *)[self.navigationController.viewControllers objectAtIndex:0];
    [vc.audioplayer pause];
    vc.stream = self.stream;
    [self.navigationController popToRootViewControllerAnimated:YES];
}
因为我现在只有一个导航控制器,所以初始的索引将是0。我可以抓取初始视图并在vc中引用它

然后我只需从它访问audioplayer,如果它仍在播放,请停止它并加载场景

然后在初始ViewController逻辑中,我使用viewDidAppear方法将新的流选择加载到显示标签和图像中

- (void)viewDidAppear:(BOOL)animated
{
    // If there is no stream selected (first run)
    // set the stream to RAPstation default
    if (self.stream == nil) 
    {
        self.stream = [[Stream alloc]initWithName:@"RAPstation" ...];
    }

    self.snameLabel.text = self.stream.sName;
    self.sdescLabel.text = self.stream.sDesc;
}

不确定这是否正确,但它现在肯定有效。如果有人能帮你把它弄干净,请放心。

我至少想出了如何让它工作的方法。我在故事板中有第二个导航控制器,删除后,它成功返回了两个视图,而不是一个

下面是我的逻辑,用于保留流数据,并在有人好奇时将其带回初始视图控制器

- (IBAction)returnHome:(id)sender
{
    ViewController *vc = (ViewController *)[self.navigationController.viewControllers objectAtIndex:0];
    [vc.audioplayer pause];
    vc.stream = self.stream;
    [self.navigationController popToRootViewControllerAnimated:YES];
}
因为我现在只有一个导航控制器,所以初始的索引将是0。我可以抓取初始视图并在vc中引用它

然后我只需从它访问audioplayer,如果它仍在播放,请停止它并加载场景

然后在初始ViewController逻辑中,我使用viewDidAppear方法将新的流选择加载到显示标签和图像中

- (void)viewDidAppear:(BOOL)animated
{
    // If there is no stream selected (first run)
    // set the stream to RAPstation default
    if (self.stream == nil) 
    {
        self.stream = [[Stream alloc]initWithName:@"RAPstation" ...];
    }

    self.snameLabel.text = self.stream.sName;
    self.sdescLabel.text = self.stream.sDesc;
}

不确定这是否正确,但它现在肯定有效。如果有人能帮你把它弄干净,请放心。

我至少想出了如何让它工作的方法。我在故事板中有第二个导航控制器,删除后,它成功返回了两个视图,而不是一个

下面是我的逻辑,用于保留流数据,并在有人好奇时将其带回初始视图控制器

- (IBAction)returnHome:(id)sender
{
    ViewController *vc = (ViewController *)[self.navigationController.viewControllers objectAtIndex:0];
    [vc.audioplayer pause];
    vc.stream = self.stream;
    [self.navigationController popToRootViewControllerAnimated:YES];
}
因为我现在只有一个导航控制器,所以初始的索引将是0。我可以抓取初始视图并在vc中引用它

然后我只需从它访问audioplayer,如果它仍在播放,请停止它并加载场景

然后在初始ViewController逻辑中,我使用viewDidAppear方法将新的流选择加载到显示标签和图像中

- (void)viewDidAppear:(BOOL)animated
{
    // If there is no stream selected (first run)
    // set the stream to RAPstation default
    if (self.stream == nil) 
    {
        self.stream = [[Stream alloc]initWithName:@"RAPstation" ...];
    }

    self.snameLabel.text = self.stream.sName;
    self.sdescLabel.text = self.stream.sDesc;
}

不确定这是否正确,但它现在肯定有效。如果有人能帮你把它弄干净,请放心。

我至少想出了如何让它工作的方法。我在故事板中有第二个导航控制器,删除后,它成功返回了两个视图,而不是一个

下面是我的逻辑,用于保留流数据,并在有人好奇时将其带回初始视图控制器

- (IBAction)returnHome:(id)sender
{
    ViewController *vc = (ViewController *)[self.navigationController.viewControllers objectAtIndex:0];
    [vc.audioplayer pause];
    vc.stream = self.stream;
    [self.navigationController popToRootViewControllerAnimated:YES];
}
因为我现在只有一个导航控制器,所以初始的索引将是0。我可以抓取初始视图并在vc中引用它

然后我只需从它访问audioplayer,如果它仍在播放,请停止它并加载场景

然后在初始ViewController逻辑中,我使用viewDidAppear方法将新的流选择加载到显示标签和图像中

- (void)viewDidAppear:(BOOL)animated
{
    // If there is no stream selected (first run)
    // set the stream to RAPstation default
    if (self.stream == nil) 
    {
        self.stream = [[Stream alloc]initWithName:@"RAPstation" ...];
    }

    self.snameLabel.text = self.stream.sName;
    self.sdescLabel.text = self.stream.sDesc;
}

不确定这是否正确,但它现在肯定有效。如果有人能帮你把它弄干净,请放心。

你想通知你的第一个VC用户改变了轨迹吗? 您只需使用NSNotificationCenter即可

首先,您必须“调谐”,即在viewDidLoad中,您的视图控制器收听特定的通知:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeStream:) name:@"UserWantToChangeStream" object:nil];
}
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
设计和实施方法:

- (void)changeStream:(NSNotification *)notification
{        
    NSString *newStreamName = notification.object;
    /* Change the stream code */
}
不要忘记停止收听通知:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeStream:) name:@"UserWantToChangeStream" object:nil];
}
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
然后在用户执行操作后发布通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"UserWantToChangeStream" object:@"new_stream_name"];
在本例中,我传递NSString new_stream_name,但您可以传递任何对象


将通知您的第一个视图控制器。

您希望能够通知您的第一个VC用户更改了轨迹吗? 您只需使用NSNotificationCenter即可

首先,您必须“调谐”,即在viewDidLoad中,您的视图控制器收听特定的通知:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeStream:) name:@"UserWantToChangeStream" object:nil];
}
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
设计和实施方法:

- (void)changeStream:(NSNotification *)notification
{        
    NSString *newStreamName = notification.object;
    /* Change the stream code */
}
不要忘记停止收听通知:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeStream:) name:@"UserWantToChangeStream" object:nil];
}
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
然后你张贴通告