1

我正在使用情节提要创建一个应用程序,其中第一个屏幕在表格视图中有歌曲列表,我想将该歌曲传递到下一个视图(我们称之为音乐播放器)。我可以做到这一点,但我还需要音乐播放器在音乐播放器播放音乐时跟踪各种锻炼统计数据。

问题是,如果我进入音乐播放器,返回歌曲列表视图,然后再次选择一个单元格,它会创建一个全新的音乐播放器实例。这是有问题的,因为它创建了一个新的计时器并且我丢失了所有的锻炼统计数据。我还发现原来的音乐播放器实例仍然存在,因为计时器继续触发。

我能做些什么来确保只有一个音乐播放器实例继续出现吗?

这是我当前的代码(按执行顺序):

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        self.nextScreen = [segue destinationViewController];
    }

^ 这会将下一个屏幕存储为成员变量。我必须这样做,因为prepareForSeque:之前调用过didSelectRowAtIndexPath:,我需要在下一个视图上设置数据。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    self.nextScreen.currentSong = [self.allSongs objectAtIndex:indexPath.row];
}

^这只是设置歌曲。

然后我继续根据需要设置下一个视图viewDidLoad:

有什么技巧可以解决这个问题吗?如果没有,有什么建议可以解决这个问题吗?我在想一种解决方法是我必须设置某种单例,我只是不确定这是否是最好的选择,因为我需要经常重置数据。

谢谢!

4

1 回答 1

1

你不能用 segues 做到这一点。转场(展开转场除外)总是在执行时创建新实例。您可以推送到您的新控制器(假设您嵌入在导航控制器中),并且在您这样做的方法中,只有在第一次时才创建一个新实例。

-(IBAction)goToNext {

    if (! self.next){
        self.next = [[NextViewController alloc] init];
        self.next.whateverProperty = whatever you want to pass;
        self.next.delegate = self; // set the delegate here if you're using delegation to send info back to this controller
    }
    [self.navigationController pushViewController:next animated:YES];
}

如果需要,您仍然可以在情节提要中设置控制器,只是不要将它们连接在一起。在这种情况下,您将使用以下内容而不是使用 alloc init 来实例化它们:

self.next = [self.storyboard instantiateViewControllerWithIdentifier:@"next"];
于 2013-01-26T16:40:36.243 回答