1

ストーリーボードを使用してアプリを作成しています。最初の画面にはテーブルビューの曲のリストがあり、その曲を次のビューに渡します(これを音楽プレーヤーと呼びます)。私はこれを達成することができますが、音楽プレーヤーが音楽を再生している間、さまざまな運動統計を追跡するために音楽プレーヤーも必要です。

問題は、音楽プレーヤーに入って曲リストビューに戻り、セルをもう一度選択すると、音楽プレーヤーのまったく新しいインスタンスが作成されることです。これは、新しいタイマーを作成し、すべての運動統計を失うため、問題があります。また、タイマーが起動し続けるため、元の音楽プレーヤーインスタンスがまだ存在していることもわかりました。

音楽プレーヤーのインスタンスが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:ます。

これを修正するためのトリックはありますか?そうでない場合、これを回避する方法について何か提案はありますか?回避策の1つは、ある種のシングルトンを設定する必要があることだと思います。データを頻繁にリセットする必要があるため、それが最善のオプションかどうかはわかりません。

ありがとう!

4

1 に答える 1

1

セグエではこれを行うことはできません。セグエ (アンワインド セグエを除く) は、実行時に常に新しいインスタンスを作成します。新しいコントローラーにプッシュすることができます (ナビゲーション コントローラーに埋め込まれていると仮定します)。これを行うメソッドでは、初めての場合にのみ新しいインスタンスを作成します。

-(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 に答える