2

iOS 6 の状態の保存/復元で遊んでいて、奇妙なケースに遭遇しました。ストーリーボード アプリのナビゲーション コントローラー内にテーブル ビュー コントローラーを埋め込むと、状態の復元をテストした後 (「ホーム ボタンを押してから停止し、 Xcode」ルーチンで実行します)。これは、iOS 6.0 用の Xcode 4.5.1 ビルドにあります。

復元をサポートするために必要な手順を実行しました。encodeRestorableStateWithCoder と e encodeRestorableStateWithCoder がテーブル ビュー コントローラーのサブクラスで呼び出されることを確認しました (はい、そのチェックを実行するときに super を呼び出します)。

ストーリーボードからナビゲーション コントローラーを削除し、代わりにテーブル ビュー コントローラーをタブ バー コントローラーに埋め込むと、スクロール位置保持されます。

私が間違っている可能性があるとしたら、何か考えはありますか?(私はそれがバグだと思う傾向があります。)

この問題を再現する正確な手順は次のとおりです (Xcode 4.5.1、iOS 6.0 の場合)。

  1. ARC が有効になっている空のテンプレートを使用して、新しい iPhone プロジェクトを作成します。

  2. Storyboard という名前のストーリーボード ファイルを作成し、それを [プロジェクト エディター] > [ターゲット] > [概要] ペインでアプリの "メイン ストーリーボード" として設定します。

  3. ナビゲーション コントローラーをストーリーボード シーンにドラッグします。

(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 を介して再度実行します。

テーブル ビューは、ホーム ボタンが押される前のポイントまでスクロールする必要がありますが、そうではありません。

4

0 に答える 0