1

2つのViewControllerを備えたアプリがあります。ViewControllerAは、タップジェスチャが割り当てられた空白のビューであり、ユーザーはビューをタブで移動し、タップのポイントでUITextViewを作成できます。ユーザーは必要な数のUITextViewを作成でき、それらはプログラムでサブビューとしてビュー(ViewControllerA)に追加されます。

ユーザーがテキストのフォントとスタイルを変更できるボタンもあります。これにより、2番目のビューコントローラーViewControllerBへのSegueがトリガーされ、ユーザーはフォント、テキストサイズ、色などを設定できます。完了すると、ユーザーはViewControllerBの[完了]ボタンをクリックし、別のSegueが最初のビュー(ViewControllerA)に戻ります。

これはすべて正常に機能します。ユーザーがViewControllerBから初期ビュー(ViewControllerA)に戻る場合を除いて、ビューはストーリーボードから再ロードされ、プログラムで追加したサブビューはなくなります。

ビュー(ViewControllerA)では、ViewDidLoadとViewWillAppearが正常に起動しているため、最初のSegueが起動したときに最初のビューが解放され、トランジションバックでストーリーボードから再作成されたようですが、サブビューは含まれていないため、もちろん含まれていません。プログラムで追加してからストーリーボードに追加しました。

メインビュー(ViewControllerA)がリロードされたときにもサブビューが再作成されるように、これを解決する方法に関するベストプラクティスの提案はありますか?

提案をありがとう!

4

2 に答える 2

1

質問から、テキストスタイルビューにセグエがあり、次に別のセグエが「元に戻った」ように聞こえます。そのようには機能しません。セグエは常に宛先VCの新しいインスタンスを作成します。テキストスタイルビューへのモーダルセグエが必要でしたが、モーダルビューコントローラーを閉じました。これにより、元のインスタンスに戻ります。

于 2012-06-16T12:17:59.553 に答える
1

念のため、他の誰かが解決策を必要とする場合に備えて、次のようにこれを解決しました。

ViewControllerAで、ツールバーを除いたメインビューのサイズのサブビューを作成しました。私はこれをcanvasViewと呼んでいます。次に、すべてのImageViewとTextViewをこのキャンバスビューに追加します。

次に、ViewControllerA viewWillDisappearで、canvasViewとそのすべてのサブビューを次のようなファイルにアーカイブします。

    NSString *archivePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"Canvas.archive"];
BOOL result = [NSKeyedArchiver archiveRootObject:_canvasView
                                     toFile:archivePath];
if (!result) {
    NSLog(@"Archive failed to archivePath %@",archivePath);
}

次に、ViewControllerA viewWillAppearで、既存のアーカイブがあるかどうかを確認し、ある場合はそれをリロードして、サブビューを正しい順序でロードします。それ以外の場合は、このような空のcanvasViewを作成します。

    // If the collageView already exists then restore it from the achive, otherwise initialize a new one.

NSString *archivePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"Canvas.archive"];

_canvasView = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];

if (_canvasView) {
    // Restore existing canvasView
    [_backgroundView addSubview:_canvasView];
} else {
    // Initialize a new canvasView
    _canvasView = [[UIScrollView alloc] initWithFrame:CGRectMake(_backgroundView.frame.origin.x, 
                                                           _backgroundView.frame.origin.y, 
                                                           _backgroundView.frame.size.width, 
                                                           _backgroundView.frame.size.height)];
    [_backgroundView addSubview:_canvasView];
}
于 2012-06-16T10:40:56.703 に答える