2011-08-22 23 views
13

UIViewControllerをNavコントローラの階層の1つに読み込み、いくつかのテキストといくつかの画像が含まれます。一番下には、展開可能な折りたたみ可能なテーブルビューを作成したいと考えています。UIViewControllerにプログラムでUITableViewを追加する

まず、この考えは可能ですか?そうであれば、どのように追加しますか?データソースを配置してメソッドを委譲する場所はどこですか?

私はちょうどTableViewControllerの別のサブクラスを作成し、それを私のViewControllerにサブビューとして追加できますか?

+0

ビューコントローラはビ​​ューではなく、ビューのみにサブビューがあるため、ビューコントローラには何も追加できません。 –

答えて

20

はい、デリゲート、データソース、および親ビューが必ずしもUITableViewControllerである必要はないUITableViewを作成できます。 UITableViewはUIViewなので、他のUIViewのサブビューとして追加することができます。 NSObjectは、必要なプロトコルメソッドを実装している限り、デリゲートまたはデータソースにすることができます。

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

実際、私の経験では、多くの人がUITableViewControllerを使用していません。最後に、テーブルビューが使用可能なスペース全体を占めるようにしたかったのはいつですか?一般的には、私は単純な古いUIViewControllerを作成し、他のサブビューに加えて、そのビューのサブビューとしてUITableViewを追加します。

+0

私はios開発の新機能を知っていて、他のオブジェクトを持つUIビューアにuitableviewを挿入する方法を正しく実装する方法を探しています。とにかく、私はこれを見つけて、あなたがチュートリアル/ソースコードを知っているかどうか分かりましたので、私はそれがどのように動作するのか理解できます。ありがとう! – gdubs

11

それはあなたのviewDidLoadメソッドのようなもので、非常に簡単です:

UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
[self.view addSubview:tableView]; 
4

ただのUITableViewControllerが唯一のコントローラのビューとして設定テーブルビューでのUIViewControllerのサブクラスであることを覚えておいてください。

確かに可能ですが、テーブルビューだけでなく、UITableViewControllerの使用を妨げる他のカスタムUI要素が必要な場合は、かなり頻繁に使用されます。

通常、初期化メソッドまたはviewDidLoadメソッドのいずれかで、ビューコントローラのビューに追加することを選択します。これは、NIBか完全にプログラムでビューを作成するかどうかによって異なります。ニブの場合

- (id)initWithNibName:(NSString*)nibName bundle:(NSBundle*)bundleName 
{ 
    if ((self = [super initWitNibName:nibName bundle:bundleName])) 
    { 
     self.theTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewWhateverStyleYouWantHere]; 
     theTableView.dataSource = self, theTableView.delegate = self; 
     [self.view addSubview:theTableView]; 
     [theTableView release]; 
    } 
} 

そして、あなたのviewDidLoadメソッドでは、あなたのテーブルビューの枠を設定することができます。

私は個人的にインターフェイスビルダーですべてのことをやりたいのですが、維持するコードが少なくても同じ結果が得られるはずです。

+0

私はIBを使って "way less code"という結果になるのは不思議です。これをコードで完全に行うと、 'initWithNibName:bundle:'は単純な 'init'に変更されますが、それ以外の変更はありますか? –

+1

私は 'datasource'は 'dataSource'でなければならないと思います –

15
/************************************************/ 
/************* MyCustomController.m *************/ 
/************************************************/ 

@interface MyCustomController() <UITableViewDataSource, UITableViewDelegate> 
@property (nonatomic, strong) UITableView *tableView; 
@end 

@implementation MyCustomController 

- (id)initWithNibName:(NSString*)nibName bundle:(NSString*)bundleName 
{ 
    self = [super initWitNibName:nibName bundle:bundleName]; 
    if (self) 
    { 
     self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; 
     tableView.datasource = self; 
     tableView.delegate = self; 
     [self.view addSubview:self.tableView]; 
    } 

    return self; 
} 

#pragma mark - UITableViewDataSource Methods 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // return number of rows 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // return cell 
} 

#pragma mark - UITableViewDelegate Methods 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // handle table view selection 
} 

@end 
2

あなたが私に似ていると、すでにのUITableViewControllerを作成し、あなたはそれが苦痛になり、書き込み直すことにそんなに仕事をしたことを実現していた場合、あなただけのUITableViewControllerを追加するには、次の手順を実行することができますサブビューとしてUIViewControllerに渡します。

UITableViewController* tableViewController = [[UITableViewController alloc] init]; 
[self.view addSubview:tableViewController.tableView]; 

上記の他の回答はすべて素晴らしいです。私は、UITableViewControllerの実装に多額の投資があり、リファクタリングが苦痛であるような気がするのであれば、これを追加すると思います。

+0

私はそのような方法を好むだろう - テーブルコントローラーはView Controllerからうまく分離されている。 – Tommz