1

UIViewでUITableViewControllerを提示したいのですが、回避策がありますが、なぜこのように機能するのかを理解したいと思います。

シナリオは次のようになります。-新しいシングルビューアプリケーションを作成しました-IB
でメインビューにビューを追加しました
-ビューのアウトレットを作成しました:

@property (weak, nonatomic) IBOutlet UIView *placeholderView;


-プロジェクトにXIBを含む新しいUITableViewControllerを追加しました-numberOfSectionsInTableViewを
1を返すように変更し、numberOfRowsInSectionを10を返すように変更し、cellForRowAtIndexPath:

cell.textLabel.text = @"hello";


-ViewControllerファイルのViewDidLoadメソッド:

ORGTableViewController *tableView = [[ORGTableViewController alloc] initWithNibName:@"ORGTableViewController" bundle:nil];

[self.placeholderView addSubview:tableView.tableView];

これで、テーブルはplaceholderViewに表示されますが、空です。TableViewControllerファイルでは、InitWithStyleメソッドとViewDidLoadメソッドが呼び出されます。ただし、numberOfSectionsInTableView、numberOfRowsInSection、およびcellForRowAtIndexPathはいずれも呼び出されません。

また、AppDelegateのこのコードをdidFinishLaunchingWithOptionsメソッドに追加しようとしましたが、期待どおりに機能しており、テキスト付きのセルが表示されます。<em>

ORGTableViewController *tableViewController = [[ORGTableViewController alloc] initWithNibName:@"ORGTableViewController" bundle:nil];

self.window.rootViewController = tableViewController;

したがって、それは機能し、UIViewにUITableViewControllerを追加したときに、委任がどういうわけか混乱したように見えます。回避策は簡単です... ViewController、viewDidLoadメソッド:

ORGTableViewController *tableViewController = [[ORGTableViewController alloc] initWithNibName:@"ORGTableViewController" bundle:nil];
tableViewController.tableView.delegate = tableViewController;

[self.placeholderView addSubview:tableViewController.tableView];

委任がこのように機能する理由を知っていますか?

THX!

4

1 に答える 1

2

あなたの質問自体に答えがあります。最初のコードでは、削除を設定していませんでしたが、2番目のコードのように、でtableViewController.tableView.delegate = tableViewController;実装されているデリゲートメソッドを呼び出すデリゲートを設定していtableViewControllerます。

クラスにデリゲートメソッドを実装することを計画している場合は、デリゲートをとして設定してから、クラスにすべてのデリゲートを実装placeholderViewする必要があります。それはうまくいったでしょう。`tableViewController.tableView.delegate = self;placeholderView

が必要な場合はUITableView、クラスをサブクラス化しUITableViewて、のサブビューとして追加することもできますplaceholderView

于 2013-01-08T01:11:49.687 に答える