ナビゲーションベースのiPhoneアプリを作成していますが、UIToolBarを画面の下部にドッキングし、UITableViewをツールバーとナビゲーションバーの間でスクロールさせたいと考えています。
このビューを処理するViewControllerは、UITableViewControllerではなく標準のUIViewControllerであることが提案されているフォーラムをいくつか見てきました。ビューコントローラは、すべての標準UIViewControllerオーバーライドに加えて、UITableViewデリゲートメソッドとデータソースメソッドを実装する必要があります。 UITableViewControllerのように機能させるには、前述のプロトコル以外に、このView Controllerサブクラスで再作成する必要がある組み込み機能(ある場合)は何ですか?このルートに行くことで私が失っているものはありますか?
または、UITableViewControllerを標準のUIViewController内にネストする方がよいでしょうか?
OS 3.0以降、ナビゲーションコントローラにはツールバーが組み込まれています。表示するには:
[self.navigationController setToolbarHidden:NO];
実装することによって:
- (void)setToolbarItems:(NSArray *)toolbarItems animated:(BOOL)animated
ビューコントローラでは、ツールバーの項目を設定できます。
したがって、ツールバーが階層内のどこにあるかを心配する必要はありません。
(タイプミスを修正)
Corey Floydは、それを除いてほとんど正しいです。
[self.navigationController setToolBarHidden:NO];
する必要があります
[self.navigationController setToolbarHidden:NO];
つまり、「setToolbarHidden」の「b」は小文字である必要があります。また、 iPhone OSリファレンス に記載されているメソッド名は実際には
- (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated
animated
パラメータを省略しても機能するようですが。
//Tool bar
[self.navigationController setToolbarHidden:NO];
UIBarButtonItem *buttonItem = [[ UIBarButtonItem alloc ] initWithTitle: @"Select All"
style: UIBarButtonItemStyleBordered
target: self
action: @selector(selectAll:) ];
UIBarButtonItem *buttonNext = [[UIBarButtonItem alloc]initWithTitle:@"Next" style:UIBarButtonItemStyleBordered target:self action:@selector(goNext:)];
self.toolbarItems = [ NSArray arrayWithObjects: buttonItem, buttonNext, nil ];
[ buttonItem release ];
[buttonNext release];
必要なのは、必要なテーブルビュー機能のレベルに必要なUITableViewDelegateメソッドとUITableViewDatasourceメソッドを実装することだけです。これらのメソッドは任意のクラスに含めることができますが、これらのクラスは関連するプロトコルに準拠している必要があります。デリゲートとデータソースは、プログラムで、またはInterfaceBuilderを使用してUITableViewインスタンスに設定する必要があります。ドキュメントによると、willは一部の機能を失います 概要セクション を参照してください。
個人的には、多くの開発者がこのすべての機能を単一のモノリシックビューコントローラークラスで提供することに夢中になっているようです。また、ビューにテーブルビューがあるため、UITableViewControllerのサブクラスを使用する必要があります。ただし、私は 単一責任の原則 を検討するのが好きで、複雑さが単純ではない場合、データソースを分割して別々のクラスに委任することがよくあります。その場合、コードは特定のUIViewController実装に関連付けられません。
個別のデータソース/デリゲートクラスがある状況では、コードではなくInterface Builderを使用して、それらを構築してテーブルビューに接続することがよくあります。このアプローチは(少なくとも私にとっては) 依存性注入 の精神に基づいており、ボイラープレートコードの記述を節約し、ある程度の デカップリング を提供します。
もちろん、これらの選択は、達成しようとしている機能の複雑さに影響されます。単純な実装の場合、UITableViewControllerを使用していることに気付くかもしれません。
これを試してみてください:
self.navigationController.toolbarHidden = NO;
それがあなたを助けることを願っています。