2

以前の質問で、iPhone アプリケーションの階層データを表示するには UITableViewController が本当に必要であることを確認できました (XCode 4.2 を使用)。

iOS 開発 - 無限レベルの uitableview

XCode 4.2 で動作する、これを行うサンプル コードを確認したいと思います。階層データの深さは 2 から 300 レベルの間であると仮定します。

このようなサンプル コード/サンプル プロジェクトはどこで見ることができますか?

編集- 私が見つけたほとんどのチュートリアルは、古いバージョンの xcode 用のようです。

4

2 に答える 2

7

この質問は非常に幅広く、これを機能させるには複数の部分があります。目立たないステップに分割すると、SO の各ステップのサンプル コードが既に見つかるか、より具体的な質問をすることができます。個々のステップについてヘルプが必要な場合は、コメントを投稿してください。ガイドできますが、1 つの質問に入力するには多すぎます。

このプロジェクトに取り組む必要があると私が考える方法は次のとおりです。

ステップ 1. データ構造を作成する

各レベルで NSArray を使用する必要があります。NSArray は、NSDictionaries または独自のカスタム NSObject クラスのリストを格納できます。どちらも機能します。標準化されたデータ構造がある場合は、独自のオブジェクトを作成して、配列の各エントリに格納することをお勧めします。アクセスごとに辞書検索を行うよりも、オブジェクトのプロパティに簡単にアクセスできます。もちろん、配列に格納するオブジェクトには、その下の子配列となる別の NSArray のフィールドが必要です。たとえば、次のようなものがあります。

@interface MyObject : NSObject {
    NSString *nodeTitle;
    NSString *nodeDescription;
    NSArray *childArray;
}

@property (nonatomic, copy) NSString *nodeTitle;
@property (nonatomic, copy) NSString *nodeDescription;
@property (nonatomic, copy) NSArray *childArray;

クラスの .m ファイルでは、init で各 ivar を nil に設定し、dealloc で各 ivar を解放します。

ステップ 2. データをロードする

フィードはすべて 1 つの大きなバッチで送信されますか?それともサーバーから一度に 1 レベルずつ要求できますか? 理想的には、回避できるのであれば、300 レベルをメモリに深く保存しないことです (かなり大きな xml ファイルのように聞こえます)。理想的には、ユーザーが階層に降りるときに各レベルをロードします。しかし、おそらく各ノードのデータ量は最小限であり、すべてを 1 ステップでロードでき、大量のメモリを占有することはありません。ロード ルーチン (ワン ショット、またはオンデマンド) を把握する必要があります。

ステップ 3. データを提示する

これは実際には非常に簡単です。テーブル ビュー (UITableViewController または UITableView が埋め込まれた UIViewController) を使用するビュー コントローラーを作成します。タイプ NSArray の ivar を作成し、この ivar のビュー コントローラーにプロパティを作成します (コピーします)。次に、このビュー コントローラーを作成するときに、ナビゲーション スタックにプッシュする前に、現在のレベルの NSArray を渡します。次に、ビュー コントローラーにプロパティとして渡される NSArray ivar を表示するようにテーブル ビューをセットアップします。たとえば、子レベルをロードするテーブルの行をクリックした場合は、次のようにします。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    int row = [indexPath row];
    MyViewController *childView = [[MyViewController alloc] init];
    childView.contentArray = ((MyObject *)[contentArray objectAtIndex:row]).childArray;
    [self.navigationController pushViewController:childView animated:YES]; 
    [childView release];     
}

これは、配列内の各エントリに対して MyObject という標準オブジェクトを作成し、次のレベルの配列である childArray というプロパティを持っていることを前提としています。

それでいい。

于 2012-04-29T03:16:26.707 に答える
1

When implementing Joel's answer, you also need to set the title of the navigation item in order to get the correct text appearring on the back buttons of each nested view:

[[childView navigationItem] setTitle:<Title from selected row>];

Also, if you are using storyboards, instead of instantiating the view controller use

[storyboard instantiateViewControllerWithIdentifier:@"myViewController"];

where myViewController is the storyboard id assigned to MyViewController

于 2013-04-21T01:47:46.343 に答える