以编程方式向UIViewController添加UITableView

我正在加载一个UIViewController到我的导航控制器的层次结构,其中将包含一些文本和一些图像。 在底部,我将要创build一个可扩展和可折叠的tableview。

首先,这个想法是可能的吗? 如果是这样,我该如何添加它,以及我在哪里放置数据源和委托方法?

我可以做一个单独的TableViewController的子类,然后将其作为子视图添加到我的ViewController?

是的,你可以创build一个UITableView,其代表,数据源和父视图不一定是UITableViewController。 由于UITableView是一个UIView,你可以添加它作为任何其他UIView的子视图。 任何NSObject都可以作为委托或数据源,只要你实现了所需的协议方法即可。

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

事实上,根据我的经验,甚至没有多less人使用UITableViewControllers。 你最后一次希望桌面视图占用整个可用空间的时间是? 一般来说,我创build一个普通的旧UIViewController,并添加一个UITableView作为其视图的子视图,除了其他子视图。

 /************************************************/ /************* 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 

这很容易,像你的viewDidLoad方法:

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

只要记住一个UITableViewController是UIViewController的一个子类,只有将tableview设置为控制器的视图。

所以是的,绝对有可能,当你想要有一个tableview,而且还有其他自定义用户界面元素,以防止您使用UITableViewController使用相当频繁。

我通常会select将其添加到我的视图控制器的视图在其初始化方法或viewDidLoad方法。 这将根据您是从NIB创build视图还是完全以编程方式而有所不同。

在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方法中设置你的tableview的框架。

我个人更喜欢在界面生成器中完成整个任务,因为您可以通过更less的代码来实现相同的结果。

如果你像我一样,已经创build了一个UITableViewController,然后意识到你做了这么多的工作,重写它将是一个痛苦,你可以做下面的UITableViewController作为子视图添加到UIViewController。

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

以上所有其他答案很好。 我想我会添加到这个有一个UITableViewController的重大投入的实现,并觉得重构将是一个痛苦。