iOS 6 の状態の保存/復元で遊んでいて、奇妙なケースに遭遇しました。ストーリーボード アプリのナビゲーション コントローラー内にテーブル ビュー コントローラーを埋め込むと、状態の復元をテストした後 (「ホーム ボタンを押してから停止し、 Xcode」ルーチンで実行します)。これは、iOS 6.0 用の Xcode 4.5.1 ビルドにあります。
復元をサポートするために必要な手順を実行しました。encodeRestorableStateWithCoder と e encodeRestorableStateWithCoder がテーブル ビュー コントローラーのサブクラスで呼び出されることを確認しました (はい、そのチェックを実行するときに super を呼び出します)。
ストーリーボードからナビゲーション コントローラーを削除し、代わりにテーブル ビュー コントローラーをタブ バー コントローラーに埋め込むと、スクロール位置が保持されます。
私が間違っている可能性があるとしたら、何か考えはありますか?(私はそれがバグだと思う傾向があります。)
この問題を再現する正確な手順は次のとおりです (Xcode 4.5.1、iOS 6.0 の場合)。
ARC が有効になっている空のテンプレートを使用して、新しい iPhone プロジェクトを作成します。
Storyboard という名前のストーリーボード ファイルを作成し、それを [プロジェクト エディター] > [ターゲット] > [概要] ペインでアプリの "メイン ストーリーボード" として設定します。
ナビゲーション コントローラーをストーリーボード シーンにドラッグします。
(4) Appdelegate.m で、@implementation セクションのコードを次のように置き換えます。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
return YES;
}
- (BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
{
return YES;
}
- (BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder
{
return YES;
}
(5) XIB なしで UITableViewController サブクラスを作成し、それを TableViewController と呼び、.m ファイルのコードを次のように置き換えます。
#import "TableViewController.h"
@implementation TableViewController
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1000;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];
return cell;
}
(6) ストーリーボードで、ユーティリティ ペインの Identity Inspector で、テーブル ビュー コントローラーのクラスを UITableViewController から TableViewController に変更します。
(7) Storyboard で、Attributes Inspector を使用して、セル再利用識別子「Cell」をテーブル ビュー セルに割り当てます。
(8) Storyboard で、ナビゲーション コントローラー、Table View Controller、および Identity Inspector の Table View に復元 ID を割り当てます。ストーリーボード ID をそれぞれ「Nav Controller」、「Table View Controller」、「Table View」に設定し、ボックスを「Use Storyboard ID」をそれぞれの復元 ID としてオンにしました。
アプリをビルドし、テーブル ビューを下にスクロールし、[ホーム] ボタンをクリックして、Xcode でアプリを停止し、Xcode を介して再度実行します。
テーブル ビューは、ホーム ボタンが押される前のポイントまでスクロールする必要がありますが、そうではありません。