1

既存のビューからプログラムで UITableViewController を表示する必要があります。

MyAppViewController があり、そのビューのボタンは新しい UITableViewController を開く必要があります。しかし、私はこれまでのところそれを機能させることができないようです。UITableViewController は次のようになります。

@interface SecondViewController : UITableViewController{}

メインビューで、次を使用してテーブルビューコントローラーを追加します。

SecondViewController vc2 = [[SecondViewController alloc] init];
vc2.view.frame = {...}
[self.view addSubview: vc2.view];

これは通常、単純なView Controllerを追加する方法なので、UITableViewControllerも同じだと思いました。

私が得る結果は、画面全体に空のセルです。これは、デリゲートが設定されていないためだと思いますが、どこに設定しますか? したがって、私の混乱は、 UITableViewController ビューコントローラーのデリゲートセッターであり、メインビューコントローラーのビューから UITableViewController を正しく表示することです。

4

4 に答える 4

4

編集

この回答は時代遅れです。ビュー コントローラーのビューを別のビュー コントローラーのサブビューとして追加する正しい方法は、コンテナー ビュー コントローラーを実装することです。

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

元の答え

あなたのパターンは少し普通ではありません。あなたが説明していることを行う最も一般的な方法は、SecondViewController を初期化して提示することです。それが実際に必要な場合は、作成、カスタマイズ、および表示の方法に関する Apple のドキュメントを熟読することを強くお勧めしUIViewControllerますUITableViewController

そのすべてを知っていて、本当に何かカスタムをしたい場合は、読み進めてください。

代わりに、SecondViewController のインスタンスを作成し、それを提示するのではなく、そのビューを現在のビュー コントローラー ビューに追加しています。何を達成しようとしているのかが分かっていて、これが実際に望んでいる結果である場合は、それを実行してください。

この一般的なパターンを構成する方法は複数あります。この例では、最も単純な方法に固執します。

1) MainViewController(MVC) は、SecondViewController必要な限り (SVC) インスタンスをプロパティに保持する必要があります。

2) SVC はそのサブクラスであるUITableViewControllerため、デフォルトでは として設定されてdataSourceおりdelegate、そのUITableView. つまり、テーブルにデータを入力するには、UITableViewDataSourceおよびUITableViewDelegateメソッドを実装する必要があります。テーブルに入力する必要があるデータを知っているSVCと仮定すると、これを に渡す必要があります。最も簡単な方法は、初期化時に設定できるプロパティを定義することです。MVCSVCSVCMVC

3) テーブルが表示された後にテーブルを閉じる方法があると仮定すると、それMVCを行う必要があります。基本的に、のビューをそのスーパービューからMVC削除してから、プロパティを nil に設定します。SVCSVC

簡単な疑似コードを次に示します。例として最低限のものを書きました。

// MainViewController.h
//
#import "SecondViewController.h"

@interface MainViewController : UIViewController
@property (nonatomic, strong) SecondViewController *svc;
@end

// MainViewController.m
//
#import "MainViewController.h"

@implementation MainViewController

// init and configure views w/ init, loadView, viewDidLoad, etc

// present SecondViewController
- (void)presentSecondViewController:(id)sender {
    self.svc = [[SecondViewController alloc] init];
    // this example uses an array as the SVC data
    self.svc.tableData = @[@"first", @"second", @"third", @"fourth"];
    self.svc.view.frame = self.view.bounds;
    [self.view addSubview:self.svc.view];
}

// dismiss SecondViewController
- (void)dismissSecondViewController:(id)sender {
    if (self.svc) {
        [self.svc.view removeFromSuperview];
        self.svc = nil;
    }
}

// SecondViewController.h
//
@interface SecondViewController : UITableViewController
@property (nonatomic, strong) NSArray *tableData;
@end

// SecondViewController.m
//
@implementation SecondViewController

// init and configure views w/ init, loadView, viewDidLoad, etc

// override tableData getter to create empty array if nil
- (NSArray *)tableData
{
    if (!tableData) {
        _tableData = @[];
    }
    return _tableData;
}

// override tableData setter to reload tableView
- (void)setTableData:(NSArray *)tableData
{
    _tableData = tableData;
    [self.tableView reloadData];
}

// implement UITableViewDelegate and UITableViewDataSource methods using
// the self.tableData array
于 2012-11-16T17:17:57.570 に答える
0

ヘッダーで、View Controller に UITableViewDataSource と UITableViewDelegate に準拠するように指示する必要があります。これを「UIViewController」の直後に追加します

<UITableViewDataSource, UITableViewDelegate>

次に、実装ファイルに、次のようなテーブルのデリゲート メソッドとデータ ソース メソッドを追加する必要があります。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

UITableViewDataSourceおよびUITableViewDelegateクラス リファレンスで完全なリストを見つけることができます。

さらに、テーブルビューを初期化する場所では、デリゲートとデータソースを現在のクラスに設定する必要があります。

[myTableView setDelegate:self];
[myTableView setDataSource:self];
于 2012-11-16T16:33:46.640 に答える
0

ここにコードがあります

1) DataSource とデリゲートを追加する.h

2)いくつかのコードを作成します.m

   thisTableView = [[UITableView alloc] initWithFrame:CGRectMake(6.5, 60,      self.view.bounds.size.width - 10, 350) style:UITableViewStylePlain];

    [thisTableView setBounces:NO];
    thisTableView.backgroundColor = [UIColor whiteColor];

thisTableView.delegate = self;
thisTableView.dataSource = self;
[self.view addSubview:thisTableView];
    [thisTableView release];
于 2012-11-16T16:30:09.820 に答える
0

さて、まず、あなたが何をしているのかと思います[self.view addSubview]プロジェクト内のすべてのビューを同じView Controllerに積み上げます。これを行うより伝統的な方法は、使い終わったらView Controllerを閉じて、新しいView Controllerを独自に作成することです。あなたがしている積み上げは型破りであり、将来あなたのコードを見ようとする人に誤解を与えると思います. さらに、実際に標準のナビゲーションを実行しようとすると、頭痛の種になります。また、メモリ管理の悪夢のように見えます (ただし、私はまだ少しあいまいであることを認めているため、実際に ARC を使用している場合、ARC がそれをクリーンアップするかどうかはわかりません)。そうは言っても、それをやろうとしている場合もありますが、よくわからない場合は、それがやりたいことではないことを意味します (やりたいことがある場合は、XJones を調べてください。答え)。あなたが探していると思うのはpresentViewController- これは、不要なコントローラーを取り除き、新しいコントローラーと交換するより一般的な方法です。取り除く

vc2.view.frame = {...}
[self.view addSubview: vc2.view];

そしてそれを

[self presentViewController:vc2 animated:/*YES or NO, try them both and use whichever one you like better*/ completion:NULL];

注: 何が機能するかは完全にcompletionはわかりません (vc2 がビルドされると、追加のメソッドを実行できるようになると思います。「presentViewController の例」をグーグルで検索すると、より多くの情報を得るために参照できる例がいくつかあります。またはApple Docsを確認してください)。私はそれを維持することNULLがうまくいくことを知っています、そしておそらくあなたが必要とすることをします.

これをすべて行うと、現在の場所に戻り、空のセルがたくさんあるビューが表示されます (ただし、より従来の方法でそこにたどり着くことができます)。

ここから、SecondViewController.m にコードを追加して、何を表示したいかを伝える必要があります。一般に、文字列の配列があり、テーブルの最初のセルにその配列の最初の文字列を表示するラベルを付け、2 番目のセルに 2 番目の文字列を表示するというようにします。これを行うには、次のようなものがありますcell.textLabel = [myArray objectAtIndex:indexPath.row];

UITableViewController のセットアップについては、この投稿で説明したことよりもはるかに多くのことがあります。そのため、YouTube などでいくつかのチュートリアルをチェックしてください。必要なものすべてをより消化しやすい形式で説明するのに時間がかかっているためです (私が見つけたこれは、私が最初にテーブル ビューを使い始めたときに非常に役立ちましたが、他にもたくさんあります)。

于 2012-11-16T17:30:11.697 に答える