11

これは不可能かもしれませんが、シーン遷移間でアプリケーションの状態を保存しようとしていますが、どうすればよいかわかりません。現在、アプリケーションを実行してホームボタンを押すと、中断したところからそのアプリケーションに戻ることができる方法が気に入っていますが、(ストーリーボードで) シーン間を切り替えると、そのシーンに戻ると、アプリケーションの状態は保存されませんでした。

保存する必要があるのは 2 つの異なるシーンだけです (一方から他方へと前後に遷移します)。正確なメモリを消費せずにストーリーボード シーンの状態を保存するにはどうすればよいですか?

詳細: これが私のストーリーボード全体です。プラス ツールバー ボタンを使用して、シーン間を行き来します。2 番目のシーンで、ユーザーがテーブル ビューのセルをタップすると、実際の画像が画像ビューに表示されます (図 1.2 を参照)。

図 1.1図 1.1

図 1.2 では、多くのテーブル ビュー セルの 1 つをタップすると何が起こるかがわかります (画像ビューがポップアップします)。

図 1.2図 1.2

問題:画像ビューを埋める表ビュー セルをタップすると (図 1.2 を参照)、そのシーンに留まるか、iPhone のホーム ボタンを押しても問題なく動作します (iPhone のホーム ボタンを押してから再度開くと)。 app シーンの状態が保存され、単純な画像で満たされた画像ビューはそのままの状態のまま表示されます)、しかし、(プラス ボタンを使用して) 最初のシーンに戻り、最初のシーンでプラス ボタンを使用すると、 2 番目のシーンに戻ると、作成したイメージ ビュー (図 1.2 を参照) が消え、塗りつぶした状態とイメージ ビューを保存せずに 2 番目のシーンが読み込まれます。

編集:両方のシーンに同じビュー コントローラーを使用してみましたが、問題は解決しませんでした。

更新:次のコードを見つけました (ビューの状態を格納していると思います)。これをどのように使用できますか?これは私が探していたものですか?

MyViewController *myViewController=[MyViewController alloc] initWithNibName:@"myView" bundle:nil];
[[self navigationController] pushViewController:myViewController animated:YES];
[myViewController release];
4

7 に答える 7

2

Figure 1.1 には根本的な欠陥があり、それがあなたの問題の根底にあると私は信じています。

セグエ (ストーリーボード上のコントローラー間の矢印)は、新しいバージョンのUIViewControllers. 循環セグエがあります。したがって、セグエを介して元の画面に「戻る」と、新しいバージョンを作成することで実際に前進します。

これはメモリ使用量に重大な問題を引き起こす可能性がありますが、新しく作成された各項目は空の状態であるため、状態を維持できないことも意味します。

を使用しているため、コントローラーを「ポップ」して削除する必要がUINavigationControllerあります。pushViewController:animated:

「2 番目の」シーンで、+ ボタンからセグエを削除し、IBActionon atouchUpInsideイベントを作成します。IBActionコードに「ポップ」を追加します

- (IBAction)plusButtonTapped {
    [self.navigationController popViewControllerAnimated:YES];
}
于 2012-04-24T20:28:36.597 に答える
2

1. DBDのアドバイスに従い、継続的に新しいビューを作成しないようにします 2. データ コントローラーである共有クラスを作成します (データが独立しているため、ゴルファー向け)シーンの)

セグエを作成する正しい方法は、左側のビュー コントローラーから右側のビュー コントローラーにつながるものを用意することです。ただし、右側のものを閉じるには、使用できます

-(IBAction)buttonPushed:(id)sender 
      [self dismissModalViewControllerAnimated:YES];
}

これにより、左側のビュー コントローラーが元の状態に戻ります。今の問題は、右側のデータをどのように保存するかです。

これを行うには、シングルトン クラスを作成できます。シングルトン クラスはインスタンスが 1 つしかないため、右側のビュー コントローラーに何度行っても、データは常に同じになります。

シングルトン クラスの実装 (DataManager というクラスの) - ヘッダー

@interface DataManager : NSObject {
}

+(id)initializeData;
-(id)init;
@end

シングルトン クラスの実装 (DataManager というクラスの) - メイン

static DataManager *sharedDataManager = nil;

@implementation DataManager
+(id)initializeData {
    @synchronized(self) {
        if (sharedDataManager == nil)
            sharedDataManager = [[self alloc] init];
    }
    return sharedDataManager;
}

-(id)init { 
    if(self == [super init]) {
    } 
    return self;
}
@end

次に、View Controller コード内で、このインスタンスを次のように取得できます。

DataManager *sharedDataManager = [DataManager initializeDataManager];

これにより、何度ビューを切り替えても同じデータが表示されます。また、データとビュー コントローラーを分離しておくことで、MVC プログラミングに準拠することができます。( http://en.wikipedia.org/wiki/Model–view–controller )

于 2012-04-25T00:19:46.327 に答える
0

Appleはあなたのためにこれをするつもりはありません。おそらく、NSUserDefaultsを使用して各ビューの状態を保存し、アプリケーションが起動するたびに、保存したデータを再ロードする必要があります。

すべてをCoreDataに保存する場合は、アクティブなビューといくつかのオブジェクトIDのみを保存する必要があります。保存しない場合は、データを保存する必要があります。

iOSが起動の間にメモリにあるものを保存することを期待しないでください。NSUserDefaultsに保存して、毎回ロードするだけです。

于 2012-04-24T01:16:58.863 に答える
0

シーンの状態をNSUserDefaultsまたはplistファイル内に保存し、シーンをロードするときに、そこから設定をロードするだけです。画像がインターネットから読み込まれる場合は、iPhoneのハードドライブにローカルに保存して、実行が少しスムーズになるようにすることもできます。

于 2012-04-24T09:30:31.493 に答える
0

私はあなたが何を意味するか分かります。これは、すべてのアプリケーションで発生するはずです。ナビゲーション スタック内の最後のビュー コントローラーが移行されると、割り当てが解除されて解放されるからです。テキストやオブジェクトの位置などの値を保存する必要がある場合は、plist が適している場合があります。plist の使用方法については、この関連する質問を参照してください。

于 2012-04-15T23:33:30.630 に答える
0

セグエを循環させるべきではないと思います。viewcontroller 2 から viewcontroller 1 を接続するものを使用するだけで十分であり、そのようにして、追加の viewcontrollers が作成されていないことを確認します (おそらくメモリの問題?)

ただし、特定の問題については、コアデータを使用してテーブルの正確な状態を保存する必要があると思います.iosは常にビューの正確な状態を保存しないためです。仕事が必要ですが、あなたはあなたが望むものを達成します。正確な写真 (保存されるコードまたは列挙型を使用)、テーブル ビュー内の場所、スコア、またはその状態を保存するために必要なデータを保存する必要があります。

何よりも優れているのは、コアデータが非常に効率的であるため、アプリが再起動されたときやフォアグラウンドになったときにデータを再読み込みするのに時間がかからず、今までコアデータを使用して 5,000 を超えるレコードを読み込んでいて、問題なく動作し、速度が遅くないことです。全て。

私が病気で家に帰ったら、私が何を意味するかを理解するために使用できるコードを提供してください.

于 2012-04-24T21:11:51.573 に答える
0

ここでの鍵は次のとおりです。

  1. アプリケーションが必要とするデータ用に何らかのストレージを用意してください。これがアプリケーションのデータ モデルです。

  2. 各View Controllerに、モデルへのアクセス、または少なくともモデルのジョブを実行する必要がある部分へのアクセスを許可します。View Controller は、モデルのデータを使用して、モデルの作成時またはビューが表示されようとしているときに自身を構成できます。

  3. ビューが消えようとしているときや、ユーザーが変更を加えるたびなど、適切なタイミングで各ビュー コントローラーにモデルを更新させます。

メモリ内のデータを整理する方法はたくさんあり、ディスクに保存する方法もたくさんあります (つまり、長期保存)。プロパティ リスト、コア データ、単純な古いデータ ファイル、およびキー付きアーカイブはすべて、データをファイルに書き込む可能性があります。NSArray、NSDictionary、NSSet などはすべて、メモリ内のデータを整理するために使用できるクラスです。ただし、View Controller を永続的に感じさせることとは何の関係もありません。確かにそれらを使用しますが、View Controller を更新する限り、どちらを選択しても問題ありません。繰り返しになりますが、重要なことは、ある種のモデルがあり、View Controller がそれにアクセスできることです。

通常、アプリ デリゲートはモデルをセットアップし、必要に応じてそれをビュー コントローラーに渡します。

他に役立つ可能性があるのは、View Controller がナビゲーション スタックから取り出されたときに、View Controller を削除する必要がないことです。必要に応じて、アプリのデリゲートで両方のビュー コントローラーを設定して、それらが固定されるようにすることができます。その後、常に新しいものを作成する代わりに、取得したものを使用できます。そうすることで、ある程度の持続性が自動的に得られます。

于 2012-04-25T00:36:30.470 に答える